2011-10-07 14:41:30 +00:00
|
|
|
/*
|
|
|
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
|
|
|
*
|
2013-05-18 09:38:23 +00:00
|
|
|
* Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
|
|
|
* Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
|
2017-11-18 13:10:32 +00:00
|
|
|
* Copyright (C) 2008 Wayne Stambaugh <stambaughw@gmail.com>
|
2019-12-30 18:28:00 +00:00
|
|
|
* Copyright (C) 1992-2019 KiCad Developers, see AUTHORS.txt for contributors.
|
2011-10-07 14:41:30 +00:00
|
|
|
*
|
|
|
|
* 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 sch_screen.cpp
|
|
|
|
* @brief Implementation of SCH_SCREEN and SCH_SCREENS classes.
|
|
|
|
*/
|
2007-06-05 12:10:51 +00:00
|
|
|
|
2012-01-23 04:33:36 +00:00
|
|
|
#include <fctsys.h>
|
|
|
|
#include <gr_basic.h>
|
2012-04-01 20:51:56 +00:00
|
|
|
#include <common.h>
|
2012-01-23 04:33:36 +00:00
|
|
|
#include <kicad_string.h>
|
|
|
|
#include <eeschema_id.h>
|
* KIWAY Milestone A): Make major modules into DLL/DSOs.
! The initial testing of this commit should be done using a Debug build so that
all the wxASSERT()s are enabled. Also, be sure and keep enabled the
USE_KIWAY_DLLs option. The tree won't likely build without it. Turning it
off is senseless anyways. If you want stable code, go back to a prior version,
the one tagged with "stable".
* Relocate all functionality out of the wxApp derivative into more finely
targeted purposes:
a) DLL/DSO specific
b) PROJECT specific
c) EXE or process specific
d) configuration file specific data
e) configuration file manipulations functions.
All of this functionality was blended into an extremely large wxApp derivative
and that was incompatible with the desire to support multiple concurrently
loaded DLL/DSO's ("KIFACE")s and multiple concurrently open projects.
An amazing amount of organization come from simply sorting each bit of
functionality into the proper box.
* Switch to wxConfigBase from wxConfig everywhere except instantiation.
* Add classes KIWAY, KIFACE, KIFACE_I, SEARCH_STACK, PGM_BASE, PGM_KICAD,
PGM_SINGLE_TOP,
* Remove "Return" prefix on many function names.
* Remove obvious comments from CMakeLists.txt files, and from else() and endif()s.
* Fix building boost for use in a DSO on linux.
* Remove some of the assumptions in the CMakeLists.txt files that windows had
to be the host platform when building windows binaries.
* Reduce the number of wxStrings being constructed at program load time via
static construction.
* Pass wxConfigBase* to all SaveSettings() and LoadSettings() functions so that
these functions are useful even when the wxConfigBase comes from another
source, as is the case in the KICAD_MANAGER_FRAME.
* Move the setting of the KIPRJMOD environment variable into class PROJECT,
so that it can be moved into a project variable soon, and out of FP_LIB_TABLE.
* Add the KIWAY_PLAYER which is associated with a particular PROJECT, and all
its child wxFrames and wxDialogs now have a Kiway() member function which
returns a KIWAY& that that window tree branch is in support of. This is like
wxWindows DNA in that child windows get this member with proper value at time
of construction.
* Anticipate some of the needs for milestones B) and C) and make code
adjustments now in an effort to reduce work in those milestones.
* No testing has been done for python scripting, since milestone C) has that
being largely reworked and re-thought-out.
2014-03-20 00:42:08 +00:00
|
|
|
#include <pgm_base.h>
|
2015-04-09 19:37:48 +00:00
|
|
|
#include <kiway.h>
|
2018-08-03 12:18:26 +00:00
|
|
|
#include <sch_draw_panel.h>
|
2019-05-10 19:57:24 +00:00
|
|
|
#include <sch_item.h>
|
2019-05-31 12:15:25 +00:00
|
|
|
#include <gr_text.h>
|
2018-01-30 10:49:51 +00:00
|
|
|
#include <sch_edit_frame.h>
|
2018-01-28 18:12:26 +00:00
|
|
|
#include <plotter.h>
|
2009-09-25 18:49:04 +00:00
|
|
|
|
2012-01-23 04:33:36 +00:00
|
|
|
#include <netlist.h>
|
2018-01-30 08:56:43 +00:00
|
|
|
#include <netlist_object.h>
|
2012-01-23 04:33:36 +00:00
|
|
|
#include <class_library.h>
|
2019-12-11 23:53:10 +00:00
|
|
|
#include <connection_graph.h>
|
2012-01-23 04:33:36 +00:00
|
|
|
#include <sch_junction.h>
|
|
|
|
#include <sch_bus_entry.h>
|
|
|
|
#include <sch_line.h>
|
|
|
|
#include <sch_marker.h>
|
|
|
|
#include <sch_no_connect.h>
|
|
|
|
#include <sch_sheet.h>
|
|
|
|
#include <sch_component.h>
|
|
|
|
#include <sch_text.h>
|
2013-09-25 19:09:57 +00:00
|
|
|
#include <lib_pin.h>
|
2017-09-01 20:42:20 +00:00
|
|
|
#include <symbol_lib_table.h>
|
2018-09-03 13:58:47 +00:00
|
|
|
#include <tool/common_tools.h>
|
2010-11-10 15:30:12 +00:00
|
|
|
|
2019-04-06 01:14:15 +00:00
|
|
|
#include <thread>
|
|
|
|
#include <algorithm>
|
|
|
|
#include <future>
|
2019-05-06 02:32:01 +00:00
|
|
|
#include <array>
|
2019-04-06 01:14:15 +00:00
|
|
|
|
2019-03-11 21:32:05 +00:00
|
|
|
// TODO(JE) Debugging only
|
|
|
|
#include <profile.h>
|
|
|
|
|
|
|
|
#include <boost/foreach.hpp>
|
|
|
|
|
2012-09-28 17:47:41 +00:00
|
|
|
#define EESCHEMA_FILE_STAMP "EESchema"
|
2019-12-30 18:28:00 +00:00
|
|
|
#define ZOOM_FACTOR( x ) ( x * IU_PER_MILS )
|
|
|
|
|
2007-06-05 12:10:51 +00:00
|
|
|
|
2015-01-06 07:38:58 +00:00
|
|
|
/* Default zoom values. Limited to these values to keep a decent size
|
2009-12-02 21:44:03 +00:00
|
|
|
* to menus
|
|
|
|
*/
|
2011-07-05 12:46:14 +00:00
|
|
|
static double SchematicZoomList[] =
|
2009-02-06 11:45:35 +00:00
|
|
|
{
|
2019-12-30 18:28:00 +00:00
|
|
|
ZOOM_FACTOR( 0.5 ),
|
|
|
|
ZOOM_FACTOR( 0.7 ),
|
|
|
|
ZOOM_FACTOR( 1.0 ),
|
|
|
|
ZOOM_FACTOR( 1.5 ),
|
|
|
|
ZOOM_FACTOR( 2.0 ),
|
|
|
|
ZOOM_FACTOR( 3.0 ),
|
|
|
|
ZOOM_FACTOR( 4.0 ),
|
|
|
|
ZOOM_FACTOR( 6.0 ),
|
|
|
|
ZOOM_FACTOR( 8.0 ),
|
|
|
|
ZOOM_FACTOR( 11.0 ),
|
|
|
|
ZOOM_FACTOR( 13.0 ),
|
|
|
|
ZOOM_FACTOR( 16.0 ),
|
|
|
|
ZOOM_FACTOR( 20.0 ),
|
|
|
|
ZOOM_FACTOR( 26.0 ),
|
|
|
|
ZOOM_FACTOR( 32.0 ),
|
|
|
|
ZOOM_FACTOR( 48.0 ),
|
|
|
|
ZOOM_FACTOR( 64.0 ),
|
|
|
|
ZOOM_FACTOR( 80.0 ),
|
|
|
|
ZOOM_FACTOR( 128.0 )
|
2009-02-06 11:45:35 +00:00
|
|
|
};
|
2009-01-29 14:26:20 +00:00
|
|
|
|
2019-12-30 18:28:00 +00:00
|
|
|
|
2010-01-29 20:36:12 +00:00
|
|
|
/* Default grid sizes for the schematic editor.
|
2015-07-20 14:11:34 +00:00
|
|
|
* Do NOT add others values (mainly grid values in mm), because they
|
|
|
|
* can break the schematic: Because wires and pins are considered as
|
|
|
|
* connected when the are to the same coordinate we cannot mix
|
|
|
|
* coordinates in mils (internal units) and mm (that cannot exactly
|
|
|
|
* converted in mils in many cases). In fact schematic must only use
|
|
|
|
* 50 and 25 mils to place labels, wires and components others values
|
|
|
|
* are useful only for graphic items (mainly in library editor) so use
|
|
|
|
* integer values in mils only. The 100 mil grid is added to help
|
|
|
|
* conform to the KiCad Library Convention. Which states: "Using a
|
|
|
|
* 100mil grid, pin ends and origin must lie on grid nodes IEC-60617"
|
2010-01-29 20:36:12 +00:00
|
|
|
*/
|
2008-12-05 16:03:05 +00:00
|
|
|
static GRID_TYPE SchematicGridList[] = {
|
2019-12-30 18:28:00 +00:00
|
|
|
{ ID_POPUP_GRID_LEVEL_100, wxRealPoint( Mils2iu( 100 ), Mils2iu( 100 ) ) },
|
|
|
|
{ ID_POPUP_GRID_LEVEL_50, wxRealPoint( Mils2iu( 50 ), Mils2iu( 50 ) ) },
|
|
|
|
{ ID_POPUP_GRID_LEVEL_25, wxRealPoint( Mils2iu( 25 ), Mils2iu( 25 ) ) },
|
|
|
|
{ ID_POPUP_GRID_LEVEL_10, wxRealPoint( Mils2iu( 10 ), Mils2iu( 10 ) ) },
|
|
|
|
{ ID_POPUP_GRID_LEVEL_5, wxRealPoint( Mils2iu( 5 ), Mils2iu( 5 ) ) },
|
|
|
|
{ ID_POPUP_GRID_LEVEL_2, wxRealPoint( Mils2iu( 2 ), Mils2iu( 2 ) ) },
|
|
|
|
{ ID_POPUP_GRID_LEVEL_1, wxRealPoint( Mils2iu( 1 ), Mils2iu( 1 ) ) },
|
2008-12-05 16:03:05 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
Modular KiCad Blueprint Milestone B), major portions:
*) When kicad.exe closes a project, close any open KIFACEs so that they cannot
get disassociated from their true PROJECT.
*) Allow loading eeschema library editor from kicad.exe
*) Allow loading pcbnew library editor from kicad.exe
*) Rename LIB_COMPONENT to LIB_PART.
*) Add class PART_LIBS, and PART_LIB.
*) Make PART_LIBS non-global, i.e. PROJECT specific.
*) Implement "data on demand" for PART_LIBS
*) Implement "data on demand" for schematic SEARCH_STACK.
*) Use RSTRINGs to retain eeschema editor's notion of last library and part being edited.
*) Get rid of library search on every SCH_COMPONENT::Draw() call, instead use
a weak pointer.
*) Remove all chdir() calls so projects don't need to be CWD.
*) Romove APPEND support from OpenProjectFiles().
*) Make OpenProjectFiles() robust, even for creating new projects.
*) Load EESCHEMA colors in the KIWAY::OnKiwayStart() rather in window open,
and save them in the .eeschema config file, not in the project file.
*) Fix bug with wxDir() while accessing protected dirs in kicad.exe
*) Consolidate template copying into PROJECT class, not in kicad.exe source.
*) Generally untangle eeschema, making its libraries not global but rather
held in the PROJECT.
2014-08-13 20:28:54 +00:00
|
|
|
SCH_SCREEN::SCH_SCREEN( KIWAY* aKiway ) :
|
|
|
|
BASE_SCREEN( SCH_SCREEN_T ),
|
2019-06-08 22:14:57 +00:00
|
|
|
KIWAY_HOLDER( aKiway, KIWAY_HOLDER::HOLDER_TYPE::SCREEN ),
|
2013-10-11 16:24:43 +00:00
|
|
|
m_paper( wxT( "A4" ) )
|
2007-06-05 12:10:51 +00:00
|
|
|
{
|
2015-02-28 20:50:35 +00:00
|
|
|
m_modification_sync = 0;
|
|
|
|
|
2012-01-05 08:07:11 +00:00
|
|
|
SetZoom( 32 );
|
2009-01-29 14:26:20 +00:00
|
|
|
|
2019-05-20 10:23:32 +00:00
|
|
|
for( unsigned zoom : SchematicZoomList )
|
|
|
|
m_ZoomList.push_back( zoom );
|
2008-12-05 16:03:05 +00:00
|
|
|
|
2019-05-20 10:23:32 +00:00
|
|
|
for( GRID_TYPE grid : SchematicGridList )
|
|
|
|
AddGrid( grid );
|
2008-12-05 16:03:05 +00:00
|
|
|
|
2019-02-08 14:34:53 +00:00
|
|
|
// Set the default grid size, now that the grid list is populated
|
2019-12-30 18:28:00 +00:00
|
|
|
SetGrid( wxRealPoint( Mils2iu( 50 ), Mils2iu( 50 ) ) );
|
2019-02-08 14:34:53 +00:00
|
|
|
|
2011-01-12 21:47:54 +00:00
|
|
|
m_refCount = 0;
|
2011-12-22 21:57:50 +00:00
|
|
|
|
2011-12-31 05:44:00 +00:00
|
|
|
// Suitable for schematic only. For libedit and viewlib, must be set to true
|
|
|
|
m_Center = false;
|
|
|
|
|
2012-01-05 08:07:11 +00:00
|
|
|
InitDataPoints( m_paper.GetSizeIU() );
|
2007-06-05 12:10:51 +00:00
|
|
|
}
|
|
|
|
|
2007-08-20 01:20:48 +00:00
|
|
|
|
2007-09-01 12:00:30 +00:00
|
|
|
SCH_SCREEN::~SCH_SCREEN()
|
2007-06-05 12:10:51 +00:00
|
|
|
{
|
2007-08-20 01:20:48 +00:00
|
|
|
ClearUndoRedoList();
|
2018-08-22 15:10:25 +00:00
|
|
|
|
2019-12-30 18:28:00 +00:00
|
|
|
// Now delete items in draw list. We do that only if the list is not empty, because if the
|
|
|
|
// list was appended to another list (see SCH_SCREEN::Append( SCH_SCREEN* aScreen ) it is
|
|
|
|
// empty but as no longer the ownership (m_drawList.meOwner == false) of items, and calling
|
2018-08-22 15:10:25 +00:00
|
|
|
// FreeDrawList() with m_drawList.meOwner == false will generate a debug alert in debug mode
|
|
|
|
if( GetDrawItems() )
|
|
|
|
FreeDrawList();
|
2007-06-05 12:10:51 +00:00
|
|
|
}
|
|
|
|
|
2007-08-20 01:20:48 +00:00
|
|
|
|
2011-01-20 16:34:57 +00:00
|
|
|
void SCH_SCREEN::IncRefCount()
|
|
|
|
{
|
|
|
|
m_refCount++;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-01-12 21:47:54 +00:00
|
|
|
void SCH_SCREEN::DecRefCount()
|
|
|
|
{
|
|
|
|
wxCHECK_RET( m_refCount != 0,
|
|
|
|
wxT( "Screen reference count already zero. Bad programmer!" ) );
|
|
|
|
m_refCount--;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-11-17 17:00:04 +00:00
|
|
|
void SCH_SCREEN::Append( SCH_SCREEN* aScreen )
|
|
|
|
{
|
|
|
|
wxCHECK_RET( aScreen, "Invalid screen object." );
|
|
|
|
|
|
|
|
// No need to decend the hierarchy. Once the top level screen is copied, all of it's
|
|
|
|
// children are copied as well.
|
|
|
|
m_drawList.Append( aScreen->m_drawList );
|
|
|
|
|
|
|
|
// This screen owns the objects now. This prevents the object from being delete when
|
|
|
|
// aSheet is deleted.
|
|
|
|
aScreen->m_drawList.SetOwnership( false );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-06-15 18:44:24 +00:00
|
|
|
void SCH_SCREEN::Clear()
|
|
|
|
{
|
|
|
|
FreeDrawList();
|
|
|
|
|
2012-05-27 00:19:12 +00:00
|
|
|
// Clear the project settings
|
|
|
|
m_ScreenNumber = m_NumberOfScreens = 1;
|
2012-01-09 08:35:06 +00:00
|
|
|
|
|
|
|
m_titles.Clear();
|
2011-06-15 18:44:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-12-02 21:44:03 +00:00
|
|
|
void SCH_SCREEN::FreeDrawList()
|
2007-06-05 12:10:51 +00:00
|
|
|
{
|
2012-02-26 18:39:39 +00:00
|
|
|
m_drawList.DeleteAll();
|
2007-06-05 12:10:51 +00:00
|
|
|
}
|
|
|
|
|
2007-08-20 01:20:48 +00:00
|
|
|
|
2012-02-26 18:39:39 +00:00
|
|
|
void SCH_SCREEN::Remove( SCH_ITEM* aItem )
|
2007-06-05 12:10:51 +00:00
|
|
|
{
|
2012-02-26 18:39:39 +00:00
|
|
|
m_drawList.Remove( aItem );
|
2007-06-05 12:10:51 +00:00
|
|
|
}
|
2008-02-26 19:19:54 +00:00
|
|
|
|
|
|
|
|
2011-03-10 19:36:30 +00:00
|
|
|
void SCH_SCREEN::DeleteItem( SCH_ITEM* aItem )
|
|
|
|
{
|
Modular KiCad Blueprint Milestone B), major portions:
*) When kicad.exe closes a project, close any open KIFACEs so that they cannot
get disassociated from their true PROJECT.
*) Allow loading eeschema library editor from kicad.exe
*) Allow loading pcbnew library editor from kicad.exe
*) Rename LIB_COMPONENT to LIB_PART.
*) Add class PART_LIBS, and PART_LIB.
*) Make PART_LIBS non-global, i.e. PROJECT specific.
*) Implement "data on demand" for PART_LIBS
*) Implement "data on demand" for schematic SEARCH_STACK.
*) Use RSTRINGs to retain eeschema editor's notion of last library and part being edited.
*) Get rid of library search on every SCH_COMPONENT::Draw() call, instead use
a weak pointer.
*) Remove all chdir() calls so projects don't need to be CWD.
*) Romove APPEND support from OpenProjectFiles().
*) Make OpenProjectFiles() robust, even for creating new projects.
*) Load EESCHEMA colors in the KIWAY::OnKiwayStart() rather in window open,
and save them in the .eeschema config file, not in the project file.
*) Fix bug with wxDir() while accessing protected dirs in kicad.exe
*) Consolidate template copying into PROJECT class, not in kicad.exe source.
*) Generally untangle eeschema, making its libraries not global but rather
held in the PROJECT.
2014-08-13 20:28:54 +00:00
|
|
|
wxCHECK_RET( aItem, wxT( "Cannot delete invalid item from screen." ) );
|
2011-03-10 19:36:30 +00:00
|
|
|
|
|
|
|
SetModify();
|
|
|
|
|
2011-03-30 19:26:05 +00:00
|
|
|
if( aItem->Type() == SCH_SHEET_PIN_T )
|
2011-03-10 19:36:30 +00:00
|
|
|
{
|
|
|
|
// This structure is attached to a sheet, get the parent sheet object.
|
2011-03-30 19:26:05 +00:00
|
|
|
SCH_SHEET_PIN* sheetPin = (SCH_SHEET_PIN*) aItem;
|
|
|
|
SCH_SHEET* sheet = sheetPin->GetParent();
|
2018-10-18 12:07:57 +00:00
|
|
|
wxCHECK_RET( sheet, wxT( "Sheet label parent not properly set, bad programmer!" ) );
|
2011-03-30 19:26:05 +00:00
|
|
|
sheet->RemovePin( sheetPin );
|
2011-03-10 19:36:30 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2018-10-24 14:18:19 +00:00
|
|
|
m_drawList.Remove( aItem );
|
2018-10-18 12:07:57 +00:00
|
|
|
delete aItem;
|
2011-03-10 19:36:30 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-04-05 14:46:51 +00:00
|
|
|
bool SCH_SCREEN::CheckIfOnDrawList( SCH_ITEM* aItem )
|
2007-06-05 12:10:51 +00:00
|
|
|
{
|
2012-02-26 18:39:39 +00:00
|
|
|
SCH_ITEM* itemList = m_drawList.begin();
|
2008-02-26 19:19:54 +00:00
|
|
|
|
2011-03-10 19:36:30 +00:00
|
|
|
while( itemList )
|
2008-02-26 19:19:54 +00:00
|
|
|
{
|
2011-04-05 14:46:51 +00:00
|
|
|
if( itemList == aItem )
|
2008-02-26 19:19:54 +00:00
|
|
|
return true;
|
2011-03-10 19:36:30 +00:00
|
|
|
|
|
|
|
itemList = itemList->Next();
|
2008-02-26 19:19:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
2007-06-05 12:10:51 +00:00
|
|
|
}
|
2008-02-26 19:19:54 +00:00
|
|
|
|
|
|
|
|
2011-03-25 19:16:05 +00:00
|
|
|
SCH_ITEM* SCH_SCREEN::GetItem( const wxPoint& aPosition, int aAccuracy, KICAD_T aType ) const
|
2011-01-11 20:34:29 +00:00
|
|
|
{
|
2019-05-06 02:32:01 +00:00
|
|
|
KICAD_T types[] = { aType, EOT };
|
|
|
|
|
Modular KiCad Blueprint Milestone B), major portions:
*) When kicad.exe closes a project, close any open KIFACEs so that they cannot
get disassociated from their true PROJECT.
*) Allow loading eeschema library editor from kicad.exe
*) Allow loading pcbnew library editor from kicad.exe
*) Rename LIB_COMPONENT to LIB_PART.
*) Add class PART_LIBS, and PART_LIB.
*) Make PART_LIBS non-global, i.e. PROJECT specific.
*) Implement "data on demand" for PART_LIBS
*) Implement "data on demand" for schematic SEARCH_STACK.
*) Use RSTRINGs to retain eeschema editor's notion of last library and part being edited.
*) Get rid of library search on every SCH_COMPONENT::Draw() call, instead use
a weak pointer.
*) Remove all chdir() calls so projects don't need to be CWD.
*) Romove APPEND support from OpenProjectFiles().
*) Make OpenProjectFiles() robust, even for creating new projects.
*) Load EESCHEMA colors in the KIWAY::OnKiwayStart() rather in window open,
and save them in the .eeschema config file, not in the project file.
*) Fix bug with wxDir() while accessing protected dirs in kicad.exe
*) Consolidate template copying into PROJECT class, not in kicad.exe source.
*) Generally untangle eeschema, making its libraries not global but rather
held in the PROJECT.
2014-08-13 20:28:54 +00:00
|
|
|
for( SCH_ITEM* item = m_drawList.begin(); item; item = item->Next() )
|
2011-01-11 20:34:29 +00:00
|
|
|
{
|
2019-05-06 02:32:01 +00:00
|
|
|
switch( item->Type() )
|
|
|
|
{
|
|
|
|
case SCH_COMPONENT_T:
|
2011-03-10 19:36:30 +00:00
|
|
|
{
|
2011-03-25 19:16:05 +00:00
|
|
|
SCH_COMPONENT* component = (SCH_COMPONENT*) item;
|
2011-03-10 19:36:30 +00:00
|
|
|
|
2011-03-25 19:16:05 +00:00
|
|
|
for( int i = REFERENCE; i < component->GetFieldCount(); i++ )
|
2011-03-10 19:36:30 +00:00
|
|
|
{
|
2011-03-25 19:16:05 +00:00
|
|
|
SCH_FIELD* field = component->GetField( i );
|
2011-03-10 19:36:30 +00:00
|
|
|
|
2019-05-06 02:32:01 +00:00
|
|
|
if( field->IsType( types ) && field->HitTest( aPosition, aAccuracy ) )
|
|
|
|
return field;
|
2011-03-10 19:36:30 +00:00
|
|
|
}
|
2019-05-06 02:32:01 +00:00
|
|
|
|
|
|
|
break;
|
2011-03-25 19:16:05 +00:00
|
|
|
}
|
2019-05-06 02:32:01 +00:00
|
|
|
case SCH_SHEET_T:
|
2011-03-25 19:16:05 +00:00
|
|
|
{
|
|
|
|
SCH_SHEET* sheet = (SCH_SHEET*)item;
|
|
|
|
|
2019-05-06 02:32:01 +00:00
|
|
|
SCH_SHEET_PIN* pin = sheet->GetPin( aPosition );
|
|
|
|
|
|
|
|
if( pin && pin->IsType( types ) )
|
|
|
|
return pin;
|
2011-03-10 19:36:30 +00:00
|
|
|
|
2019-05-06 02:32:01 +00:00
|
|
|
break;
|
2011-03-25 19:16:05 +00:00
|
|
|
}
|
2019-05-06 02:32:01 +00:00
|
|
|
default:
|
|
|
|
break;
|
2011-03-10 19:36:30 +00:00
|
|
|
}
|
2019-05-06 02:32:01 +00:00
|
|
|
|
|
|
|
if( item->IsType( types ) && item->HitTest( aPosition, aAccuracy ) )
|
|
|
|
return item;
|
2011-03-10 19:36:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-02-26 18:39:39 +00:00
|
|
|
void SCH_SCREEN::ReplaceWires( DLIST< SCH_ITEM >& aWireList )
|
2011-02-05 02:21:11 +00:00
|
|
|
{
|
|
|
|
SCH_ITEM* item;
|
|
|
|
SCH_ITEM* next_item;
|
|
|
|
|
Modular KiCad Blueprint Milestone B), major portions:
*) When kicad.exe closes a project, close any open KIFACEs so that they cannot
get disassociated from their true PROJECT.
*) Allow loading eeschema library editor from kicad.exe
*) Allow loading pcbnew library editor from kicad.exe
*) Rename LIB_COMPONENT to LIB_PART.
*) Add class PART_LIBS, and PART_LIB.
*) Make PART_LIBS non-global, i.e. PROJECT specific.
*) Implement "data on demand" for PART_LIBS
*) Implement "data on demand" for schematic SEARCH_STACK.
*) Use RSTRINGs to retain eeschema editor's notion of last library and part being edited.
*) Get rid of library search on every SCH_COMPONENT::Draw() call, instead use
a weak pointer.
*) Remove all chdir() calls so projects don't need to be CWD.
*) Romove APPEND support from OpenProjectFiles().
*) Make OpenProjectFiles() robust, even for creating new projects.
*) Load EESCHEMA colors in the KIWAY::OnKiwayStart() rather in window open,
and save them in the .eeschema config file, not in the project file.
*) Fix bug with wxDir() while accessing protected dirs in kicad.exe
*) Consolidate template copying into PROJECT class, not in kicad.exe source.
*) Generally untangle eeschema, making its libraries not global but rather
held in the PROJECT.
2014-08-13 20:28:54 +00:00
|
|
|
for( item = m_drawList.begin(); item; item = next_item )
|
2011-02-05 02:21:11 +00:00
|
|
|
{
|
|
|
|
next_item = item->Next();
|
|
|
|
|
|
|
|
switch( item->Type() )
|
|
|
|
{
|
|
|
|
case SCH_JUNCTION_T:
|
|
|
|
case SCH_LINE_T:
|
2012-02-26 18:39:39 +00:00
|
|
|
Remove( item );
|
2011-02-05 02:21:11 +00:00
|
|
|
delete item;
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-02-26 18:39:39 +00:00
|
|
|
m_drawList.Append( aWireList );
|
2011-02-05 02:21:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-03-10 19:36:30 +00:00
|
|
|
void SCH_SCREEN::MarkConnections( SCH_LINE* aSegment )
|
|
|
|
{
|
Modular KiCad Blueprint Milestone B), major portions:
*) When kicad.exe closes a project, close any open KIFACEs so that they cannot
get disassociated from their true PROJECT.
*) Allow loading eeschema library editor from kicad.exe
*) Allow loading pcbnew library editor from kicad.exe
*) Rename LIB_COMPONENT to LIB_PART.
*) Add class PART_LIBS, and PART_LIB.
*) Make PART_LIBS non-global, i.e. PROJECT specific.
*) Implement "data on demand" for PART_LIBS
*) Implement "data on demand" for schematic SEARCH_STACK.
*) Use RSTRINGs to retain eeschema editor's notion of last library and part being edited.
*) Get rid of library search on every SCH_COMPONENT::Draw() call, instead use
a weak pointer.
*) Remove all chdir() calls so projects don't need to be CWD.
*) Romove APPEND support from OpenProjectFiles().
*) Make OpenProjectFiles() robust, even for creating new projects.
*) Load EESCHEMA colors in the KIWAY::OnKiwayStart() rather in window open,
and save them in the .eeschema config file, not in the project file.
*) Fix bug with wxDir() while accessing protected dirs in kicad.exe
*) Consolidate template copying into PROJECT class, not in kicad.exe source.
*) Generally untangle eeschema, making its libraries not global but rather
held in the PROJECT.
2014-08-13 20:28:54 +00:00
|
|
|
wxCHECK_RET( (aSegment) && (aSegment->Type() == SCH_LINE_T),
|
2011-03-10 19:36:30 +00:00
|
|
|
wxT( "Invalid object pointer." ) );
|
|
|
|
|
Modular KiCad Blueprint Milestone B), major portions:
*) When kicad.exe closes a project, close any open KIFACEs so that they cannot
get disassociated from their true PROJECT.
*) Allow loading eeschema library editor from kicad.exe
*) Allow loading pcbnew library editor from kicad.exe
*) Rename LIB_COMPONENT to LIB_PART.
*) Add class PART_LIBS, and PART_LIB.
*) Make PART_LIBS non-global, i.e. PROJECT specific.
*) Implement "data on demand" for PART_LIBS
*) Implement "data on demand" for schematic SEARCH_STACK.
*) Use RSTRINGs to retain eeschema editor's notion of last library and part being edited.
*) Get rid of library search on every SCH_COMPONENT::Draw() call, instead use
a weak pointer.
*) Remove all chdir() calls so projects don't need to be CWD.
*) Romove APPEND support from OpenProjectFiles().
*) Make OpenProjectFiles() robust, even for creating new projects.
*) Load EESCHEMA colors in the KIWAY::OnKiwayStart() rather in window open,
and save them in the .eeschema config file, not in the project file.
*) Fix bug with wxDir() while accessing protected dirs in kicad.exe
*) Consolidate template copying into PROJECT class, not in kicad.exe source.
*) Generally untangle eeschema, making its libraries not global but rather
held in the PROJECT.
2014-08-13 20:28:54 +00:00
|
|
|
for( SCH_ITEM* item = m_drawList.begin(); item; item = item->Next() )
|
2011-03-10 19:36:30 +00:00
|
|
|
{
|
2019-08-27 12:12:34 +00:00
|
|
|
if( item->HasFlag( CANDIDATE ) )
|
2011-03-10 19:36:30 +00:00
|
|
|
continue;
|
|
|
|
|
|
|
|
if( item->Type() == SCH_JUNCTION_T )
|
|
|
|
{
|
|
|
|
SCH_JUNCTION* junction = (SCH_JUNCTION*) item;
|
|
|
|
|
2011-10-19 20:32:21 +00:00
|
|
|
if( aSegment->IsEndPoint( junction->GetPosition() ) )
|
2011-03-10 19:36:30 +00:00
|
|
|
item->SetFlags( CANDIDATE );
|
|
|
|
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
if( item->Type() != SCH_LINE_T )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
SCH_LINE* segment = (SCH_LINE*) item;
|
|
|
|
|
2011-12-07 20:19:29 +00:00
|
|
|
if( aSegment->IsEndPoint( segment->GetStartPoint() )
|
|
|
|
&& !GetPin( segment->GetStartPoint(), NULL, true ) )
|
2011-03-10 19:36:30 +00:00
|
|
|
{
|
|
|
|
item->SetFlags( CANDIDATE );
|
|
|
|
MarkConnections( segment );
|
|
|
|
}
|
|
|
|
|
2011-12-07 20:19:29 +00:00
|
|
|
if( aSegment->IsEndPoint( segment->GetEndPoint() )
|
|
|
|
&& !GetPin( segment->GetEndPoint(), NULL, true ) )
|
2011-03-10 19:36:30 +00:00
|
|
|
{
|
|
|
|
item->SetFlags( CANDIDATE );
|
|
|
|
MarkConnections( segment );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-11-27 19:27:24 +00:00
|
|
|
bool SCH_SCREEN::IsJunctionNeeded( const wxPoint& aPosition, bool aNew )
|
2011-03-10 19:36:30 +00:00
|
|
|
{
|
2019-05-17 09:29:52 +00:00
|
|
|
enum { WIRES, BUSSES } layers;
|
|
|
|
|
|
|
|
bool has_nonparallel[ sizeof( layers ) ] = { false };
|
|
|
|
int end_count[ sizeof( layers ) ] = { 0 };
|
2017-12-13 05:12:06 +00:00
|
|
|
int pin_count = 0;
|
|
|
|
|
2019-05-17 09:29:52 +00:00
|
|
|
std::vector<SCH_LINE*> lines[ sizeof( layers ) ];
|
2017-11-27 19:27:24 +00:00
|
|
|
|
|
|
|
for( SCH_ITEM* item = m_drawList.begin(); item; item = item->Next() )
|
2011-03-10 19:36:30 +00:00
|
|
|
{
|
2019-04-22 08:58:06 +00:00
|
|
|
if( item->GetEditFlags() & STRUCT_DELETED )
|
2017-11-27 19:27:24 +00:00
|
|
|
continue;
|
2017-12-07 20:19:53 +00:00
|
|
|
|
2017-11-27 19:27:24 +00:00
|
|
|
if( aNew && ( item->Type() == SCH_JUNCTION_T ) && ( item->HitTest( aPosition ) ) )
|
|
|
|
return false;
|
2011-03-10 19:36:30 +00:00
|
|
|
|
2019-05-17 09:29:52 +00:00
|
|
|
if( ( item->Type() == SCH_LINE_T ) && ( item->HitTest( aPosition, 0 ) ) )
|
2017-12-13 05:12:06 +00:00
|
|
|
{
|
|
|
|
if( item->GetLayer() == LAYER_WIRE )
|
2019-05-17 09:29:52 +00:00
|
|
|
lines[ WIRES ].push_back( (SCH_LINE*) item );
|
2017-12-13 05:12:06 +00:00
|
|
|
else if( item->GetLayer() == LAYER_BUS )
|
2019-05-17 09:29:52 +00:00
|
|
|
lines[ BUSSES ].push_back( (SCH_LINE*) item );
|
2017-12-13 05:12:06 +00:00
|
|
|
}
|
2017-12-07 20:19:53 +00:00
|
|
|
|
2019-05-17 09:29:52 +00:00
|
|
|
if( ( item->Type() == SCH_COMPONENT_T ) && ( item->IsConnected( aPosition ) ) )
|
2017-12-07 20:19:53 +00:00
|
|
|
pin_count++;
|
2011-03-10 19:36:30 +00:00
|
|
|
}
|
|
|
|
|
2019-05-17 09:29:52 +00:00
|
|
|
for( int i : { WIRES, BUSSES } )
|
2017-11-27 19:27:24 +00:00
|
|
|
{
|
2017-12-13 05:12:06 +00:00
|
|
|
bool removed_overlapping = false;
|
|
|
|
end_count[i] = lines[i].size();
|
|
|
|
|
|
|
|
for( auto line = lines[i].begin(); line < lines[i].end(); line++ )
|
2017-11-27 19:27:24 +00:00
|
|
|
{
|
2017-12-13 05:12:06 +00:00
|
|
|
// Consider ending on a line to be equivalent to two endpoints because
|
|
|
|
// we will want to split the line if anything else connects
|
|
|
|
if( !(*line)->IsEndPoint( aPosition ) )
|
|
|
|
end_count[i]++;
|
|
|
|
|
|
|
|
for( auto second_line = lines[i].end() - 1; second_line > line; second_line-- )
|
|
|
|
{
|
|
|
|
if( !(*line)->IsParallel( *second_line ) )
|
|
|
|
has_nonparallel[i] = true;
|
|
|
|
else if( !removed_overlapping
|
|
|
|
&& (*line)->IsSameQuadrant( *second_line, aPosition ) )
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* Overlapping lines that point in the same direction should not be counted
|
|
|
|
* as extra end_points. We remove the overlapping lines, being careful to only
|
|
|
|
* remove them once.
|
|
|
|
*/
|
|
|
|
removed_overlapping = true;
|
|
|
|
end_count[i]--;
|
|
|
|
}
|
|
|
|
}
|
2017-11-27 19:27:24 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-07 20:19:53 +00:00
|
|
|
// If there are three or more endpoints
|
2019-10-19 03:15:29 +00:00
|
|
|
if( pin_count && pin_count + end_count[WIRES] > 2 )
|
2017-11-27 19:27:24 +00:00
|
|
|
return true;
|
|
|
|
|
|
|
|
// If there is at least one segment that ends on a non-parallel line or
|
|
|
|
// junction of two other lines
|
2019-10-19 03:15:29 +00:00
|
|
|
if( has_nonparallel[WIRES] && end_count[WIRES] > 2 )
|
2017-12-13 05:12:06 +00:00
|
|
|
return true;
|
|
|
|
|
|
|
|
// Check for bus - bus junction requirements
|
2019-10-19 03:15:29 +00:00
|
|
|
if( has_nonparallel[BUSSES] && end_count[BUSSES] > 2 )
|
2017-11-27 19:27:24 +00:00
|
|
|
return true;
|
|
|
|
|
2011-03-10 19:36:30 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-03-25 19:16:05 +00:00
|
|
|
bool SCH_SCREEN::IsTerminalPoint( const wxPoint& aPosition, int aLayer )
|
|
|
|
{
|
|
|
|
wxCHECK_MSG( aLayer == LAYER_NOTES || aLayer == LAYER_BUS || aLayer == LAYER_WIRE, false,
|
|
|
|
wxT( "Invalid layer type passed to SCH_SCREEN::IsTerminalPoint()." ) );
|
|
|
|
|
|
|
|
SCH_SHEET_PIN* label;
|
|
|
|
SCH_TEXT* text;
|
2019-03-11 21:32:05 +00:00
|
|
|
SCH_CONNECTION conn;
|
2011-03-25 19:16:05 +00:00
|
|
|
|
|
|
|
switch( aLayer )
|
|
|
|
{
|
|
|
|
case LAYER_BUS:
|
|
|
|
|
|
|
|
if( GetBus( aPosition ) )
|
|
|
|
return true;
|
|
|
|
|
|
|
|
label = GetSheetLabel( aPosition );
|
|
|
|
|
2019-03-11 21:32:05 +00:00
|
|
|
if( label && conn.IsBusLabel( label->GetText() ) && label->IsConnected( aPosition ) )
|
2011-03-25 19:16:05 +00:00
|
|
|
return true;
|
|
|
|
|
|
|
|
text = GetLabel( aPosition );
|
|
|
|
|
2019-03-11 21:32:05 +00:00
|
|
|
if( text && conn.IsBusLabel( text->GetText() ) && text->IsConnected( aPosition )
|
2011-03-25 19:16:05 +00:00
|
|
|
&& (text->Type() != SCH_LABEL_T) )
|
|
|
|
return true;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LAYER_NOTES:
|
|
|
|
|
|
|
|
if( GetLine( aPosition ) )
|
|
|
|
return true;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LAYER_WIRE:
|
2013-04-01 10:35:20 +00:00
|
|
|
if( GetItem( aPosition, std::max( GetDefaultLineThickness(), 3 ), SCH_BUS_WIRE_ENTRY_T) )
|
|
|
|
return true;
|
|
|
|
|
|
|
|
if( GetItem( aPosition, std::max( GetDefaultLineThickness(), 3 ), SCH_BUS_BUS_ENTRY_T) )
|
2011-03-25 19:16:05 +00:00
|
|
|
return true;
|
|
|
|
|
2012-09-28 17:47:41 +00:00
|
|
|
if( GetItem( aPosition, std::max( GetDefaultLineThickness(), 3 ), SCH_JUNCTION_T ) )
|
2011-03-25 19:16:05 +00:00
|
|
|
return true;
|
|
|
|
|
|
|
|
if( GetPin( aPosition, NULL, true ) )
|
|
|
|
return true;
|
|
|
|
|
|
|
|
if( GetWire( aPosition ) )
|
|
|
|
return true;
|
|
|
|
|
|
|
|
text = GetLabel( aPosition );
|
|
|
|
|
2019-03-11 21:32:05 +00:00
|
|
|
if( text && text->IsConnected( aPosition ) && !conn.IsBusLabel( text->GetText() ) )
|
2011-03-25 19:16:05 +00:00
|
|
|
return true;
|
|
|
|
|
|
|
|
label = GetSheetLabel( aPosition );
|
|
|
|
|
2019-03-11 21:32:05 +00:00
|
|
|
if( label && label->IsConnected( aPosition ) && !conn.IsBusLabel( label->GetText() ) )
|
2011-03-25 19:16:05 +00:00
|
|
|
return true;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-10-22 00:48:25 +00:00
|
|
|
void SCH_SCREEN::UpdateSymbolLinks( bool aForce )
|
2011-01-11 20:34:29 +00:00
|
|
|
{
|
2014-08-18 16:39:51 +00:00
|
|
|
// Initialize or reinitialize the pointer to the LIB_PART for each component
|
|
|
|
// found in m_drawList, but only if needed (change in lib or schematic)
|
|
|
|
// therefore the calculation time is usually very low.
|
Modular KiCad Blueprint Milestone B), major portions:
*) When kicad.exe closes a project, close any open KIFACEs so that they cannot
get disassociated from their true PROJECT.
*) Allow loading eeschema library editor from kicad.exe
*) Allow loading pcbnew library editor from kicad.exe
*) Rename LIB_COMPONENT to LIB_PART.
*) Add class PART_LIBS, and PART_LIB.
*) Make PART_LIBS non-global, i.e. PROJECT specific.
*) Implement "data on demand" for PART_LIBS
*) Implement "data on demand" for schematic SEARCH_STACK.
*) Use RSTRINGs to retain eeschema editor's notion of last library and part being edited.
*) Get rid of library search on every SCH_COMPONENT::Draw() call, instead use
a weak pointer.
*) Remove all chdir() calls so projects don't need to be CWD.
*) Romove APPEND support from OpenProjectFiles().
*) Make OpenProjectFiles() robust, even for creating new projects.
*) Load EESCHEMA colors in the KIWAY::OnKiwayStart() rather in window open,
and save them in the .eeschema config file, not in the project file.
*) Fix bug with wxDir() while accessing protected dirs in kicad.exe
*) Consolidate template copying into PROJECT class, not in kicad.exe source.
*) Generally untangle eeschema, making its libraries not global but rather
held in the PROJECT.
2014-08-13 20:28:54 +00:00
|
|
|
if( m_drawList.GetCount() )
|
|
|
|
{
|
2017-09-01 20:42:20 +00:00
|
|
|
SYMBOL_LIB_TABLE* libs = Prj().SchSymbolLibTable();
|
|
|
|
int mod_hash = libs->GetModifyHash();
|
2019-05-10 19:22:26 +00:00
|
|
|
EE_TYPE_COLLECTOR c;
|
2017-12-11 03:28:34 +00:00
|
|
|
|
2019-05-10 19:22:26 +00:00
|
|
|
c.Collect( GetDrawItems(), EE_COLLECTOR::ComponentsOnly );
|
Modular KiCad Blueprint Milestone B), major portions:
*) When kicad.exe closes a project, close any open KIFACEs so that they cannot
get disassociated from their true PROJECT.
*) Allow loading eeschema library editor from kicad.exe
*) Allow loading pcbnew library editor from kicad.exe
*) Rename LIB_COMPONENT to LIB_PART.
*) Add class PART_LIBS, and PART_LIB.
*) Make PART_LIBS non-global, i.e. PROJECT specific.
*) Implement "data on demand" for PART_LIBS
*) Implement "data on demand" for schematic SEARCH_STACK.
*) Use RSTRINGs to retain eeschema editor's notion of last library and part being edited.
*) Get rid of library search on every SCH_COMPONENT::Draw() call, instead use
a weak pointer.
*) Remove all chdir() calls so projects don't need to be CWD.
*) Romove APPEND support from OpenProjectFiles().
*) Make OpenProjectFiles() robust, even for creating new projects.
*) Load EESCHEMA colors in the KIWAY::OnKiwayStart() rather in window open,
and save them in the .eeschema config file, not in the project file.
*) Fix bug with wxDir() while accessing protected dirs in kicad.exe
*) Consolidate template copying into PROJECT class, not in kicad.exe source.
*) Generally untangle eeschema, making its libraries not global but rather
held in the PROJECT.
2014-08-13 20:28:54 +00:00
|
|
|
|
|
|
|
// Must we resolve?
|
2017-10-22 00:48:25 +00:00
|
|
|
if( (m_modification_sync != mod_hash) || aForce )
|
Modular KiCad Blueprint Milestone B), major portions:
*) When kicad.exe closes a project, close any open KIFACEs so that they cannot
get disassociated from their true PROJECT.
*) Allow loading eeschema library editor from kicad.exe
*) Allow loading pcbnew library editor from kicad.exe
*) Rename LIB_COMPONENT to LIB_PART.
*) Add class PART_LIBS, and PART_LIB.
*) Make PART_LIBS non-global, i.e. PROJECT specific.
*) Implement "data on demand" for PART_LIBS
*) Implement "data on demand" for schematic SEARCH_STACK.
*) Use RSTRINGs to retain eeschema editor's notion of last library and part being edited.
*) Get rid of library search on every SCH_COMPONENT::Draw() call, instead use
a weak pointer.
*) Remove all chdir() calls so projects don't need to be CWD.
*) Romove APPEND support from OpenProjectFiles().
*) Make OpenProjectFiles() robust, even for creating new projects.
*) Load EESCHEMA colors in the KIWAY::OnKiwayStart() rather in window open,
and save them in the .eeschema config file, not in the project file.
*) Fix bug with wxDir() while accessing protected dirs in kicad.exe
*) Consolidate template copying into PROJECT class, not in kicad.exe source.
*) Generally untangle eeschema, making its libraries not global but rather
held in the PROJECT.
2014-08-13 20:28:54 +00:00
|
|
|
{
|
2017-09-01 20:42:20 +00:00
|
|
|
SCH_COMPONENT::ResolveAll( c, *libs, Prj().SchLibs()->GetCacheLibrary() );
|
Modular KiCad Blueprint Milestone B), major portions:
*) When kicad.exe closes a project, close any open KIFACEs so that they cannot
get disassociated from their true PROJECT.
*) Allow loading eeschema library editor from kicad.exe
*) Allow loading pcbnew library editor from kicad.exe
*) Rename LIB_COMPONENT to LIB_PART.
*) Add class PART_LIBS, and PART_LIB.
*) Make PART_LIBS non-global, i.e. PROJECT specific.
*) Implement "data on demand" for PART_LIBS
*) Implement "data on demand" for schematic SEARCH_STACK.
*) Use RSTRINGs to retain eeschema editor's notion of last library and part being edited.
*) Get rid of library search on every SCH_COMPONENT::Draw() call, instead use
a weak pointer.
*) Remove all chdir() calls so projects don't need to be CWD.
*) Romove APPEND support from OpenProjectFiles().
*) Make OpenProjectFiles() robust, even for creating new projects.
*) Load EESCHEMA colors in the KIWAY::OnKiwayStart() rather in window open,
and save them in the .eeschema config file, not in the project file.
*) Fix bug with wxDir() while accessing protected dirs in kicad.exe
*) Consolidate template copying into PROJECT class, not in kicad.exe source.
*) Generally untangle eeschema, making its libraries not global but rather
held in the PROJECT.
2014-08-13 20:28:54 +00:00
|
|
|
|
|
|
|
m_modification_sync = mod_hash; // note the last mod_hash
|
|
|
|
}
|
2017-12-11 03:28:34 +00:00
|
|
|
// Resolving will update the pin caches but we must ensure that this happens
|
|
|
|
// even if the libraries don't change.
|
|
|
|
else
|
2019-04-04 11:07:07 +00:00
|
|
|
SCH_COMPONENT::UpdatePins( c );
|
Modular KiCad Blueprint Milestone B), major portions:
*) When kicad.exe closes a project, close any open KIFACEs so that they cannot
get disassociated from their true PROJECT.
*) Allow loading eeschema library editor from kicad.exe
*) Allow loading pcbnew library editor from kicad.exe
*) Rename LIB_COMPONENT to LIB_PART.
*) Add class PART_LIBS, and PART_LIB.
*) Make PART_LIBS non-global, i.e. PROJECT specific.
*) Implement "data on demand" for PART_LIBS
*) Implement "data on demand" for schematic SEARCH_STACK.
*) Use RSTRINGs to retain eeschema editor's notion of last library and part being edited.
*) Get rid of library search on every SCH_COMPONENT::Draw() call, instead use
a weak pointer.
*) Remove all chdir() calls so projects don't need to be CWD.
*) Romove APPEND support from OpenProjectFiles().
*) Make OpenProjectFiles() robust, even for creating new projects.
*) Load EESCHEMA colors in the KIWAY::OnKiwayStart() rather in window open,
and save them in the .eeschema config file, not in the project file.
*) Fix bug with wxDir() while accessing protected dirs in kicad.exe
*) Consolidate template copying into PROJECT class, not in kicad.exe source.
*) Generally untangle eeschema, making its libraries not global but rather
held in the PROJECT.
2014-08-13 20:28:54 +00:00
|
|
|
}
|
2014-08-18 16:39:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-05-31 12:15:25 +00:00
|
|
|
void SCH_SCREEN::Print( wxDC* aDC )
|
2014-08-18 16:39:51 +00:00
|
|
|
{
|
2017-11-03 17:56:59 +00:00
|
|
|
std::vector< SCH_ITEM* > junctions;
|
2014-08-18 16:39:51 +00:00
|
|
|
|
2017-07-12 09:55:51 +00:00
|
|
|
// Ensure links are up to date, even if a library was reloaded for some reason:
|
2017-10-22 00:48:25 +00:00
|
|
|
UpdateSymbolLinks();
|
2017-07-12 09:55:51 +00:00
|
|
|
|
Modular KiCad Blueprint Milestone B), major portions:
*) When kicad.exe closes a project, close any open KIFACEs so that they cannot
get disassociated from their true PROJECT.
*) Allow loading eeschema library editor from kicad.exe
*) Allow loading pcbnew library editor from kicad.exe
*) Rename LIB_COMPONENT to LIB_PART.
*) Add class PART_LIBS, and PART_LIB.
*) Make PART_LIBS non-global, i.e. PROJECT specific.
*) Implement "data on demand" for PART_LIBS
*) Implement "data on demand" for schematic SEARCH_STACK.
*) Use RSTRINGs to retain eeschema editor's notion of last library and part being edited.
*) Get rid of library search on every SCH_COMPONENT::Draw() call, instead use
a weak pointer.
*) Remove all chdir() calls so projects don't need to be CWD.
*) Romove APPEND support from OpenProjectFiles().
*) Make OpenProjectFiles() robust, even for creating new projects.
*) Load EESCHEMA colors in the KIWAY::OnKiwayStart() rather in window open,
and save them in the .eeschema config file, not in the project file.
*) Fix bug with wxDir() while accessing protected dirs in kicad.exe
*) Consolidate template copying into PROJECT class, not in kicad.exe source.
*) Generally untangle eeschema, making its libraries not global but rather
held in the PROJECT.
2014-08-13 20:28:54 +00:00
|
|
|
for( SCH_ITEM* item = m_drawList.begin(); item; item = item->Next() )
|
2011-01-11 20:34:29 +00:00
|
|
|
{
|
2011-07-08 19:55:41 +00:00
|
|
|
if( item->IsMoving() || item->IsResized() )
|
2011-01-11 20:34:29 +00:00
|
|
|
continue;
|
|
|
|
|
2017-11-03 17:56:59 +00:00
|
|
|
if( item->Type() == SCH_JUNCTION_T )
|
|
|
|
junctions.push_back( item );
|
|
|
|
else
|
2019-05-31 12:15:25 +00:00
|
|
|
item->Print( aDC, wxPoint( 0, 0 ) );
|
2011-01-11 20:34:29 +00:00
|
|
|
}
|
2017-11-03 17:56:59 +00:00
|
|
|
|
|
|
|
for( auto item : junctions )
|
2019-05-31 12:15:25 +00:00
|
|
|
item->Print( aDC, wxPoint( 0, 0 ) );
|
2011-01-11 20:34:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-06-17 13:24:22 +00:00
|
|
|
void SCH_SCREEN::Plot( PLOTTER* aPlotter )
|
|
|
|
{
|
2019-06-16 20:27:11 +00:00
|
|
|
// Ensure links are up to date, even if a library was reloaded for some reason:
|
|
|
|
std::vector< SCH_ITEM* > junctions;
|
|
|
|
std::vector< SCH_ITEM* > bitmaps;
|
|
|
|
std::vector< SCH_ITEM* > other;
|
|
|
|
|
2017-07-12 09:55:51 +00:00
|
|
|
// Ensure links are up to date, even if a library was reloaded for some reason:
|
2017-10-22 00:48:25 +00:00
|
|
|
UpdateSymbolLinks();
|
2017-07-12 09:55:51 +00:00
|
|
|
|
2019-06-16 20:27:11 +00:00
|
|
|
for( SCH_ITEM* item = m_drawList.begin(); item; item = item->Next() )
|
|
|
|
{
|
|
|
|
if( item->IsMoving() || item->IsResized() )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if( item->Type() == SCH_JUNCTION_T )
|
|
|
|
junctions.push_back( item );
|
|
|
|
else if( item->Type() == SCH_BITMAP_T )
|
|
|
|
bitmaps.push_back( item );
|
|
|
|
else
|
|
|
|
// uncomment line below when there is a virtual EDA_ITEM::GetBoundingBox()
|
|
|
|
// if( panel->GetClipBox().Intersects( item->GetBoundingBox() ) )
|
|
|
|
other.push_back( item );
|
|
|
|
}
|
|
|
|
|
|
|
|
// Bitmaps are drawn first to ensure they are in the background
|
|
|
|
// This is particularly important for the wxPostscriptDC (used in *nix printers) as
|
|
|
|
// the bitmap PS command clears the screen
|
|
|
|
for( auto item : bitmaps )
|
|
|
|
{
|
|
|
|
aPlotter->SetCurrentLineWidth( item->GetPenSize() );
|
|
|
|
item->Plot( aPlotter );
|
|
|
|
}
|
|
|
|
|
|
|
|
for( auto item : other )
|
|
|
|
{
|
|
|
|
aPlotter->SetCurrentLineWidth( item->GetPenSize() );
|
|
|
|
item->Plot( aPlotter );
|
|
|
|
}
|
|
|
|
|
|
|
|
for( auto item : junctions )
|
2011-06-17 13:24:22 +00:00
|
|
|
{
|
2012-05-03 18:37:56 +00:00
|
|
|
aPlotter->SetCurrentLineWidth( item->GetPenSize() );
|
2011-06-17 13:24:22 +00:00
|
|
|
item->Plot( aPlotter );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-10-26 20:25:48 +00:00
|
|
|
void SCH_SCREEN::ClearUndoORRedoList( UNDO_REDO_CONTAINER& aList, int aItemCount )
|
|
|
|
{
|
|
|
|
if( aItemCount == 0 )
|
|
|
|
return;
|
|
|
|
|
2017-11-08 16:32:56 +00:00
|
|
|
for( auto& command : aList.m_CommandsList )
|
2010-10-26 20:25:48 +00:00
|
|
|
{
|
2017-11-08 16:32:56 +00:00
|
|
|
command->ClearListAndDeleteItems();
|
|
|
|
delete command;
|
2010-10-26 20:25:48 +00:00
|
|
|
}
|
2017-11-08 16:32:56 +00:00
|
|
|
|
|
|
|
aList.m_CommandsList.clear();
|
2010-10-26 20:25:48 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-11-03 14:13:15 +00:00
|
|
|
void SCH_SCREEN::ClearDrawingState()
|
|
|
|
{
|
Modular KiCad Blueprint Milestone B), major portions:
*) When kicad.exe closes a project, close any open KIFACEs so that they cannot
get disassociated from their true PROJECT.
*) Allow loading eeschema library editor from kicad.exe
*) Allow loading pcbnew library editor from kicad.exe
*) Rename LIB_COMPONENT to LIB_PART.
*) Add class PART_LIBS, and PART_LIB.
*) Make PART_LIBS non-global, i.e. PROJECT specific.
*) Implement "data on demand" for PART_LIBS
*) Implement "data on demand" for schematic SEARCH_STACK.
*) Use RSTRINGs to retain eeschema editor's notion of last library and part being edited.
*) Get rid of library search on every SCH_COMPONENT::Draw() call, instead use
a weak pointer.
*) Remove all chdir() calls so projects don't need to be CWD.
*) Romove APPEND support from OpenProjectFiles().
*) Make OpenProjectFiles() robust, even for creating new projects.
*) Load EESCHEMA colors in the KIWAY::OnKiwayStart() rather in window open,
and save them in the .eeschema config file, not in the project file.
*) Fix bug with wxDir() while accessing protected dirs in kicad.exe
*) Consolidate template copying into PROJECT class, not in kicad.exe source.
*) Generally untangle eeschema, making its libraries not global but rather
held in the PROJECT.
2014-08-13 20:28:54 +00:00
|
|
|
for( SCH_ITEM* item = m_drawList.begin(); item; item = item->Next() )
|
2019-05-01 11:37:35 +00:00
|
|
|
item->ClearTempFlags();
|
2010-11-03 14:13:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-01-10 20:35:24 +00:00
|
|
|
LIB_PIN* SCH_SCREEN::GetPin( const wxPoint& aPosition, SCH_COMPONENT** aComponent,
|
2011-03-10 19:36:30 +00:00
|
|
|
bool aEndPointOnly ) const
|
2010-12-13 15:59:00 +00:00
|
|
|
{
|
Modular KiCad Blueprint Milestone B), major portions:
*) When kicad.exe closes a project, close any open KIFACEs so that they cannot
get disassociated from their true PROJECT.
*) Allow loading eeschema library editor from kicad.exe
*) Allow loading pcbnew library editor from kicad.exe
*) Rename LIB_COMPONENT to LIB_PART.
*) Add class PART_LIBS, and PART_LIB.
*) Make PART_LIBS non-global, i.e. PROJECT specific.
*) Implement "data on demand" for PART_LIBS
*) Implement "data on demand" for schematic SEARCH_STACK.
*) Use RSTRINGs to retain eeschema editor's notion of last library and part being edited.
*) Get rid of library search on every SCH_COMPONENT::Draw() call, instead use
a weak pointer.
*) Remove all chdir() calls so projects don't need to be CWD.
*) Romove APPEND support from OpenProjectFiles().
*) Make OpenProjectFiles() robust, even for creating new projects.
*) Load EESCHEMA colors in the KIWAY::OnKiwayStart() rather in window open,
and save them in the .eeschema config file, not in the project file.
*) Fix bug with wxDir() while accessing protected dirs in kicad.exe
*) Consolidate template copying into PROJECT class, not in kicad.exe source.
*) Generally untangle eeschema, making its libraries not global but rather
held in the PROJECT.
2014-08-13 20:28:54 +00:00
|
|
|
SCH_ITEM* item;
|
|
|
|
SCH_COMPONENT* component = NULL;
|
|
|
|
LIB_PIN* pin = NULL;
|
2010-12-13 15:59:00 +00:00
|
|
|
|
Modular KiCad Blueprint Milestone B), major portions:
*) When kicad.exe closes a project, close any open KIFACEs so that they cannot
get disassociated from their true PROJECT.
*) Allow loading eeschema library editor from kicad.exe
*) Allow loading pcbnew library editor from kicad.exe
*) Rename LIB_COMPONENT to LIB_PART.
*) Add class PART_LIBS, and PART_LIB.
*) Make PART_LIBS non-global, i.e. PROJECT specific.
*) Implement "data on demand" for PART_LIBS
*) Implement "data on demand" for schematic SEARCH_STACK.
*) Use RSTRINGs to retain eeschema editor's notion of last library and part being edited.
*) Get rid of library search on every SCH_COMPONENT::Draw() call, instead use
a weak pointer.
*) Remove all chdir() calls so projects don't need to be CWD.
*) Romove APPEND support from OpenProjectFiles().
*) Make OpenProjectFiles() robust, even for creating new projects.
*) Load EESCHEMA colors in the KIWAY::OnKiwayStart() rather in window open,
and save them in the .eeschema config file, not in the project file.
*) Fix bug with wxDir() while accessing protected dirs in kicad.exe
*) Consolidate template copying into PROJECT class, not in kicad.exe source.
*) Generally untangle eeschema, making its libraries not global but rather
held in the PROJECT.
2014-08-13 20:28:54 +00:00
|
|
|
for( item = m_drawList.begin(); item; item = item->Next() )
|
2010-12-13 15:59:00 +00:00
|
|
|
{
|
|
|
|
if( item->Type() != SCH_COMPONENT_T )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
component = (SCH_COMPONENT*) item;
|
|
|
|
|
2011-05-05 17:45:35 +00:00
|
|
|
if( aEndPointOnly )
|
|
|
|
{
|
|
|
|
pin = NULL;
|
2011-12-07 20:19:29 +00:00
|
|
|
|
2019-11-06 19:15:42 +00:00
|
|
|
if( !component->GetPartRef() )
|
2011-05-05 17:45:35 +00:00
|
|
|
continue;
|
2011-12-07 20:19:29 +00:00
|
|
|
|
2019-11-06 19:15:42 +00:00
|
|
|
for( pin = component->GetPartRef()->GetNextPin(); pin;
|
|
|
|
pin = component->GetPartRef()->GetNextPin( pin ) )
|
2011-05-05 17:45:35 +00:00
|
|
|
{
|
|
|
|
// Skip items not used for this part.
|
|
|
|
if( component->GetUnit() && pin->GetUnit() &&
|
|
|
|
( pin->GetUnit() != component->GetUnit() ) )
|
|
|
|
continue;
|
2011-12-07 20:19:29 +00:00
|
|
|
|
2011-05-05 17:45:35 +00:00
|
|
|
if( component->GetConvert() && pin->GetConvert() &&
|
|
|
|
( pin->GetConvert() != component->GetConvert() ) )
|
|
|
|
continue;
|
2011-12-07 20:19:29 +00:00
|
|
|
|
2011-05-05 17:45:35 +00:00
|
|
|
if(component->GetPinPhysicalPosition( pin ) == aPosition )
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if( pin )
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pin = (LIB_PIN*) component->GetDrawItem( aPosition, LIB_PIN_T );
|
2011-12-07 20:19:29 +00:00
|
|
|
|
2011-05-05 17:45:35 +00:00
|
|
|
if( pin )
|
|
|
|
break;
|
|
|
|
}
|
2011-03-25 19:16:05 +00:00
|
|
|
}
|
2011-01-10 20:35:24 +00:00
|
|
|
|
2011-05-05 17:45:35 +00:00
|
|
|
if( pin && aComponent )
|
2010-12-13 15:59:00 +00:00
|
|
|
*aComponent = component;
|
|
|
|
|
|
|
|
return pin;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-08-31 13:27:05 +00:00
|
|
|
SCH_SHEET* SCH_SCREEN::GetSheet( const wxString& aName )
|
|
|
|
{
|
Modular KiCad Blueprint Milestone B), major portions:
*) When kicad.exe closes a project, close any open KIFACEs so that they cannot
get disassociated from their true PROJECT.
*) Allow loading eeschema library editor from kicad.exe
*) Allow loading pcbnew library editor from kicad.exe
*) Rename LIB_COMPONENT to LIB_PART.
*) Add class PART_LIBS, and PART_LIB.
*) Make PART_LIBS non-global, i.e. PROJECT specific.
*) Implement "data on demand" for PART_LIBS
*) Implement "data on demand" for schematic SEARCH_STACK.
*) Use RSTRINGs to retain eeschema editor's notion of last library and part being edited.
*) Get rid of library search on every SCH_COMPONENT::Draw() call, instead use
a weak pointer.
*) Remove all chdir() calls so projects don't need to be CWD.
*) Romove APPEND support from OpenProjectFiles().
*) Make OpenProjectFiles() robust, even for creating new projects.
*) Load EESCHEMA colors in the KIWAY::OnKiwayStart() rather in window open,
and save them in the .eeschema config file, not in the project file.
*) Fix bug with wxDir() while accessing protected dirs in kicad.exe
*) Consolidate template copying into PROJECT class, not in kicad.exe source.
*) Generally untangle eeschema, making its libraries not global but rather
held in the PROJECT.
2014-08-13 20:28:54 +00:00
|
|
|
for( SCH_ITEM* item = m_drawList.begin(); item; item = item->Next() )
|
2011-08-31 13:27:05 +00:00
|
|
|
{
|
|
|
|
if( item->Type() != SCH_SHEET_T )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
SCH_SHEET* sheet = (SCH_SHEET*) item;
|
|
|
|
|
2011-12-08 15:45:01 +00:00
|
|
|
if( aName.CmpNoCase( sheet->GetName() ) == 0 )
|
2011-08-31 13:27:05 +00:00
|
|
|
return sheet;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-01-11 20:34:29 +00:00
|
|
|
SCH_SHEET_PIN* SCH_SCREEN::GetSheetLabel( const wxPoint& aPosition )
|
|
|
|
{
|
2011-03-30 19:26:05 +00:00
|
|
|
SCH_SHEET_PIN* sheetPin = NULL;
|
2011-01-11 20:34:29 +00:00
|
|
|
|
Modular KiCad Blueprint Milestone B), major portions:
*) When kicad.exe closes a project, close any open KIFACEs so that they cannot
get disassociated from their true PROJECT.
*) Allow loading eeschema library editor from kicad.exe
*) Allow loading pcbnew library editor from kicad.exe
*) Rename LIB_COMPONENT to LIB_PART.
*) Add class PART_LIBS, and PART_LIB.
*) Make PART_LIBS non-global, i.e. PROJECT specific.
*) Implement "data on demand" for PART_LIBS
*) Implement "data on demand" for schematic SEARCH_STACK.
*) Use RSTRINGs to retain eeschema editor's notion of last library and part being edited.
*) Get rid of library search on every SCH_COMPONENT::Draw() call, instead use
a weak pointer.
*) Remove all chdir() calls so projects don't need to be CWD.
*) Romove APPEND support from OpenProjectFiles().
*) Make OpenProjectFiles() robust, even for creating new projects.
*) Load EESCHEMA colors in the KIWAY::OnKiwayStart() rather in window open,
and save them in the .eeschema config file, not in the project file.
*) Fix bug with wxDir() while accessing protected dirs in kicad.exe
*) Consolidate template copying into PROJECT class, not in kicad.exe source.
*) Generally untangle eeschema, making its libraries not global but rather
held in the PROJECT.
2014-08-13 20:28:54 +00:00
|
|
|
for( SCH_ITEM* item = m_drawList.begin(); item; item = item->Next() )
|
2011-01-11 20:34:29 +00:00
|
|
|
{
|
|
|
|
if( item->Type() != SCH_SHEET_T )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
SCH_SHEET* sheet = (SCH_SHEET*) item;
|
2011-03-30 19:26:05 +00:00
|
|
|
sheetPin = sheet->GetPin( aPosition );
|
2011-01-11 20:34:29 +00:00
|
|
|
|
2011-03-30 19:26:05 +00:00
|
|
|
if( sheetPin )
|
2011-01-11 20:34:29 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2011-03-30 19:26:05 +00:00
|
|
|
return sheetPin;
|
2011-01-11 20:34:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-12-13 15:59:00 +00:00
|
|
|
int SCH_SCREEN::CountConnectedItems( const wxPoint& aPos, bool aTestJunctions ) const
|
|
|
|
{
|
|
|
|
SCH_ITEM* item;
|
|
|
|
int count = 0;
|
|
|
|
|
Modular KiCad Blueprint Milestone B), major portions:
*) When kicad.exe closes a project, close any open KIFACEs so that they cannot
get disassociated from their true PROJECT.
*) Allow loading eeschema library editor from kicad.exe
*) Allow loading pcbnew library editor from kicad.exe
*) Rename LIB_COMPONENT to LIB_PART.
*) Add class PART_LIBS, and PART_LIB.
*) Make PART_LIBS non-global, i.e. PROJECT specific.
*) Implement "data on demand" for PART_LIBS
*) Implement "data on demand" for schematic SEARCH_STACK.
*) Use RSTRINGs to retain eeschema editor's notion of last library and part being edited.
*) Get rid of library search on every SCH_COMPONENT::Draw() call, instead use
a weak pointer.
*) Remove all chdir() calls so projects don't need to be CWD.
*) Romove APPEND support from OpenProjectFiles().
*) Make OpenProjectFiles() robust, even for creating new projects.
*) Load EESCHEMA colors in the KIWAY::OnKiwayStart() rather in window open,
and save them in the .eeschema config file, not in the project file.
*) Fix bug with wxDir() while accessing protected dirs in kicad.exe
*) Consolidate template copying into PROJECT class, not in kicad.exe source.
*) Generally untangle eeschema, making its libraries not global but rather
held in the PROJECT.
2014-08-13 20:28:54 +00:00
|
|
|
for( item = m_drawList.begin(); item; item = item->Next() )
|
2010-12-13 15:59:00 +00:00
|
|
|
{
|
|
|
|
if( item->Type() == SCH_JUNCTION_T && !aTestJunctions )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if( item->IsConnected( aPos ) )
|
|
|
|
count++;
|
|
|
|
}
|
|
|
|
|
|
|
|
return count;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-02-15 20:22:45 +00:00
|
|
|
void SCH_SCREEN::ClearAnnotation( SCH_SHEET_PATH* aSheetPath )
|
2010-12-31 19:47:39 +00:00
|
|
|
{
|
Modular KiCad Blueprint Milestone B), major portions:
*) When kicad.exe closes a project, close any open KIFACEs so that they cannot
get disassociated from their true PROJECT.
*) Allow loading eeschema library editor from kicad.exe
*) Allow loading pcbnew library editor from kicad.exe
*) Rename LIB_COMPONENT to LIB_PART.
*) Add class PART_LIBS, and PART_LIB.
*) Make PART_LIBS non-global, i.e. PROJECT specific.
*) Implement "data on demand" for PART_LIBS
*) Implement "data on demand" for schematic SEARCH_STACK.
*) Use RSTRINGs to retain eeschema editor's notion of last library and part being edited.
*) Get rid of library search on every SCH_COMPONENT::Draw() call, instead use
a weak pointer.
*) Remove all chdir() calls so projects don't need to be CWD.
*) Romove APPEND support from OpenProjectFiles().
*) Make OpenProjectFiles() robust, even for creating new projects.
*) Load EESCHEMA colors in the KIWAY::OnKiwayStart() rather in window open,
and save them in the .eeschema config file, not in the project file.
*) Fix bug with wxDir() while accessing protected dirs in kicad.exe
*) Consolidate template copying into PROJECT class, not in kicad.exe source.
*) Generally untangle eeschema, making its libraries not global but rather
held in the PROJECT.
2014-08-13 20:28:54 +00:00
|
|
|
for( SCH_ITEM* item = m_drawList.begin(); item; item = item->Next() )
|
2010-12-31 19:47:39 +00:00
|
|
|
{
|
|
|
|
if( item->Type() == SCH_COMPONENT_T )
|
|
|
|
{
|
|
|
|
SCH_COMPONENT* component = (SCH_COMPONENT*) item;
|
|
|
|
|
2016-02-15 20:22:45 +00:00
|
|
|
component->ClearAnnotation( aSheetPath );
|
2013-07-03 07:27:52 +00:00
|
|
|
|
|
|
|
// Clear the modified component flag set by component->ClearAnnotation
|
|
|
|
// because we do not use it here and we should not leave this flag set,
|
2018-06-22 13:05:11 +00:00
|
|
|
// when an editing is finished:
|
2013-07-03 07:27:52 +00:00
|
|
|
component->ClearFlags();
|
2010-12-31 19:47:39 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-09-03 10:11:39 +00:00
|
|
|
void SCH_SCREEN::EnsureAlternateReferencesExist()
|
|
|
|
{
|
|
|
|
if( GetClientSheetPathsCount() <= 1 ) // No need for alternate reference
|
|
|
|
return;
|
|
|
|
|
|
|
|
for( SCH_ITEM* item = m_drawList.begin(); item; item = item->Next() )
|
|
|
|
{
|
|
|
|
if( item->Type() != SCH_COMPONENT_T )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
// Add (when not existing) all sheet path entries
|
|
|
|
for( unsigned int ii = 0; ii < m_clientSheetPathList.GetCount(); ii++ )
|
2018-09-04 16:46:03 +00:00
|
|
|
((SCH_COMPONENT*)item)->AddSheetPathReferenceEntryIfMissing( m_clientSheetPathList[ii] );
|
2018-09-03 10:11:39 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-03-25 19:16:05 +00:00
|
|
|
void SCH_SCREEN::GetHierarchicalItems( EDA_ITEMS& aItems )
|
2010-12-31 19:47:39 +00:00
|
|
|
{
|
2012-02-26 18:39:39 +00:00
|
|
|
SCH_ITEM* item = m_drawList.begin();
|
2010-12-31 19:47:39 +00:00
|
|
|
|
|
|
|
while( item )
|
|
|
|
{
|
|
|
|
if( ( item->Type() == SCH_SHEET_T ) || ( item->Type() == SCH_COMPONENT_T ) )
|
|
|
|
aItems.push_back( item );
|
|
|
|
|
|
|
|
item = item->Next();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-02-19 15:41:32 +00:00
|
|
|
bool SCH_SCREEN::TestDanglingEnds()
|
2011-01-21 19:30:59 +00:00
|
|
|
{
|
|
|
|
SCH_ITEM* item;
|
|
|
|
std::vector< DANGLING_END_ITEM > endPoints;
|
2016-02-19 15:41:32 +00:00
|
|
|
bool hasStateChanged = false;
|
2011-01-21 19:30:59 +00:00
|
|
|
|
Modular KiCad Blueprint Milestone B), major portions:
*) When kicad.exe closes a project, close any open KIFACEs so that they cannot
get disassociated from their true PROJECT.
*) Allow loading eeschema library editor from kicad.exe
*) Allow loading pcbnew library editor from kicad.exe
*) Rename LIB_COMPONENT to LIB_PART.
*) Add class PART_LIBS, and PART_LIB.
*) Make PART_LIBS non-global, i.e. PROJECT specific.
*) Implement "data on demand" for PART_LIBS
*) Implement "data on demand" for schematic SEARCH_STACK.
*) Use RSTRINGs to retain eeschema editor's notion of last library and part being edited.
*) Get rid of library search on every SCH_COMPONENT::Draw() call, instead use
a weak pointer.
*) Remove all chdir() calls so projects don't need to be CWD.
*) Romove APPEND support from OpenProjectFiles().
*) Make OpenProjectFiles() robust, even for creating new projects.
*) Load EESCHEMA colors in the KIWAY::OnKiwayStart() rather in window open,
and save them in the .eeschema config file, not in the project file.
*) Fix bug with wxDir() while accessing protected dirs in kicad.exe
*) Consolidate template copying into PROJECT class, not in kicad.exe source.
*) Generally untangle eeschema, making its libraries not global but rather
held in the PROJECT.
2014-08-13 20:28:54 +00:00
|
|
|
for( item = m_drawList.begin(); item; item = item->Next() )
|
2011-01-21 19:30:59 +00:00
|
|
|
item->GetEndPoints( endPoints );
|
|
|
|
|
2012-02-26 18:39:39 +00:00
|
|
|
for( item = m_drawList.begin(); item; item = item->Next() )
|
2011-01-21 19:30:59 +00:00
|
|
|
{
|
2018-10-29 18:11:04 +00:00
|
|
|
if( item->UpdateDanglingState( endPoints ) )
|
2016-02-19 15:41:32 +00:00
|
|
|
hasStateChanged = true;
|
2011-01-21 19:30:59 +00:00
|
|
|
}
|
|
|
|
|
2016-02-19 15:41:32 +00:00
|
|
|
return hasStateChanged;
|
2011-01-21 19:30:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-03-25 19:16:05 +00:00
|
|
|
SCH_LINE* SCH_SCREEN::GetWireOrBus( const wxPoint& aPosition )
|
|
|
|
{
|
2019-04-30 13:54:32 +00:00
|
|
|
static KICAD_T types[] = { SCH_LINE_LOCATE_WIRE_T, SCH_LINE_LOCATE_BUS_T, EOT };
|
|
|
|
|
Modular KiCad Blueprint Milestone B), major portions:
*) When kicad.exe closes a project, close any open KIFACEs so that they cannot
get disassociated from their true PROJECT.
*) Allow loading eeschema library editor from kicad.exe
*) Allow loading pcbnew library editor from kicad.exe
*) Rename LIB_COMPONENT to LIB_PART.
*) Add class PART_LIBS, and PART_LIB.
*) Make PART_LIBS non-global, i.e. PROJECT specific.
*) Implement "data on demand" for PART_LIBS
*) Implement "data on demand" for schematic SEARCH_STACK.
*) Use RSTRINGs to retain eeschema editor's notion of last library and part being edited.
*) Get rid of library search on every SCH_COMPONENT::Draw() call, instead use
a weak pointer.
*) Remove all chdir() calls so projects don't need to be CWD.
*) Romove APPEND support from OpenProjectFiles().
*) Make OpenProjectFiles() robust, even for creating new projects.
*) Load EESCHEMA colors in the KIWAY::OnKiwayStart() rather in window open,
and save them in the .eeschema config file, not in the project file.
*) Fix bug with wxDir() while accessing protected dirs in kicad.exe
*) Consolidate template copying into PROJECT class, not in kicad.exe source.
*) Generally untangle eeschema, making its libraries not global but rather
held in the PROJECT.
2014-08-13 20:28:54 +00:00
|
|
|
for( SCH_ITEM* item = m_drawList.begin(); item; item = item->Next() )
|
2011-03-25 19:16:05 +00:00
|
|
|
{
|
2019-04-30 13:54:32 +00:00
|
|
|
if( item->IsType( types ) && item->HitTest( aPosition ) )
|
2011-03-25 19:16:05 +00:00
|
|
|
return (SCH_LINE*) item;
|
|
|
|
}
|
|
|
|
|
2019-04-30 13:54:32 +00:00
|
|
|
return nullptr;
|
2011-03-25 19:16:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SCH_LINE* SCH_SCREEN::GetLine( const wxPoint& aPosition, int aAccuracy, int aLayer,
|
|
|
|
SCH_LINE_TEST_T aSearchType )
|
|
|
|
{
|
Modular KiCad Blueprint Milestone B), major portions:
*) When kicad.exe closes a project, close any open KIFACEs so that they cannot
get disassociated from their true PROJECT.
*) Allow loading eeschema library editor from kicad.exe
*) Allow loading pcbnew library editor from kicad.exe
*) Rename LIB_COMPONENT to LIB_PART.
*) Add class PART_LIBS, and PART_LIB.
*) Make PART_LIBS non-global, i.e. PROJECT specific.
*) Implement "data on demand" for PART_LIBS
*) Implement "data on demand" for schematic SEARCH_STACK.
*) Use RSTRINGs to retain eeschema editor's notion of last library and part being edited.
*) Get rid of library search on every SCH_COMPONENT::Draw() call, instead use
a weak pointer.
*) Remove all chdir() calls so projects don't need to be CWD.
*) Romove APPEND support from OpenProjectFiles().
*) Make OpenProjectFiles() robust, even for creating new projects.
*) Load EESCHEMA colors in the KIWAY::OnKiwayStart() rather in window open,
and save them in the .eeschema config file, not in the project file.
*) Fix bug with wxDir() while accessing protected dirs in kicad.exe
*) Consolidate template copying into PROJECT class, not in kicad.exe source.
*) Generally untangle eeschema, making its libraries not global but rather
held in the PROJECT.
2014-08-13 20:28:54 +00:00
|
|
|
for( SCH_ITEM* item = m_drawList.begin(); item; item = item->Next() )
|
2011-03-25 19:16:05 +00:00
|
|
|
{
|
|
|
|
if( item->Type() != SCH_LINE_T )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if( item->GetLayer() != aLayer )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if( !item->HitTest( aPosition, aAccuracy ) )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
switch( aSearchType )
|
|
|
|
{
|
|
|
|
case ENTIRE_LENGTH_T:
|
|
|
|
return (SCH_LINE*) item;
|
|
|
|
|
|
|
|
case EXCLUDE_END_POINTS_T:
|
|
|
|
if( !( (SCH_LINE*) item )->IsEndPoint( aPosition ) )
|
|
|
|
return (SCH_LINE*) item;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case END_POINTS_ONLY_T:
|
|
|
|
if( ( (SCH_LINE*) item )->IsEndPoint( aPosition ) )
|
|
|
|
return (SCH_LINE*) item;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SCH_TEXT* SCH_SCREEN::GetLabel( const wxPoint& aPosition, int aAccuracy )
|
|
|
|
{
|
Modular KiCad Blueprint Milestone B), major portions:
*) When kicad.exe closes a project, close any open KIFACEs so that they cannot
get disassociated from their true PROJECT.
*) Allow loading eeschema library editor from kicad.exe
*) Allow loading pcbnew library editor from kicad.exe
*) Rename LIB_COMPONENT to LIB_PART.
*) Add class PART_LIBS, and PART_LIB.
*) Make PART_LIBS non-global, i.e. PROJECT specific.
*) Implement "data on demand" for PART_LIBS
*) Implement "data on demand" for schematic SEARCH_STACK.
*) Use RSTRINGs to retain eeschema editor's notion of last library and part being edited.
*) Get rid of library search on every SCH_COMPONENT::Draw() call, instead use
a weak pointer.
*) Remove all chdir() calls so projects don't need to be CWD.
*) Romove APPEND support from OpenProjectFiles().
*) Make OpenProjectFiles() robust, even for creating new projects.
*) Load EESCHEMA colors in the KIWAY::OnKiwayStart() rather in window open,
and save them in the .eeschema config file, not in the project file.
*) Fix bug with wxDir() while accessing protected dirs in kicad.exe
*) Consolidate template copying into PROJECT class, not in kicad.exe source.
*) Generally untangle eeschema, making its libraries not global but rather
held in the PROJECT.
2014-08-13 20:28:54 +00:00
|
|
|
for( SCH_ITEM* item = m_drawList.begin(); item; item = item->Next() )
|
2011-03-25 19:16:05 +00:00
|
|
|
{
|
|
|
|
switch( item->Type() )
|
|
|
|
{
|
|
|
|
case SCH_LABEL_T:
|
|
|
|
case SCH_GLOBAL_LABEL_T:
|
2019-04-15 23:56:41 +00:00
|
|
|
case SCH_HIER_LABEL_T:
|
2011-03-25 19:16:05 +00:00
|
|
|
if( item->HitTest( aPosition, aAccuracy ) )
|
|
|
|
return (SCH_TEXT*) item;
|
|
|
|
|
|
|
|
default:
|
|
|
|
;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-02-15 20:14:07 +00:00
|
|
|
bool SCH_SCREEN::SetComponentFootprint( SCH_SHEET_PATH* aSheetPath, const wxString& aReference,
|
2011-03-28 18:23:01 +00:00
|
|
|
const wxString& aFootPrint, bool aSetVisible )
|
|
|
|
{
|
|
|
|
SCH_COMPONENT* component;
|
|
|
|
bool found = false;
|
|
|
|
|
Modular KiCad Blueprint Milestone B), major portions:
*) When kicad.exe closes a project, close any open KIFACEs so that they cannot
get disassociated from their true PROJECT.
*) Allow loading eeschema library editor from kicad.exe
*) Allow loading pcbnew library editor from kicad.exe
*) Rename LIB_COMPONENT to LIB_PART.
*) Add class PART_LIBS, and PART_LIB.
*) Make PART_LIBS non-global, i.e. PROJECT specific.
*) Implement "data on demand" for PART_LIBS
*) Implement "data on demand" for schematic SEARCH_STACK.
*) Use RSTRINGs to retain eeschema editor's notion of last library and part being edited.
*) Get rid of library search on every SCH_COMPONENT::Draw() call, instead use
a weak pointer.
*) Remove all chdir() calls so projects don't need to be CWD.
*) Romove APPEND support from OpenProjectFiles().
*) Make OpenProjectFiles() robust, even for creating new projects.
*) Load EESCHEMA colors in the KIWAY::OnKiwayStart() rather in window open,
and save them in the .eeschema config file, not in the project file.
*) Fix bug with wxDir() while accessing protected dirs in kicad.exe
*) Consolidate template copying into PROJECT class, not in kicad.exe source.
*) Generally untangle eeschema, making its libraries not global but rather
held in the PROJECT.
2014-08-13 20:28:54 +00:00
|
|
|
for( SCH_ITEM* item = m_drawList.begin(); item; item = item->Next() )
|
2011-03-28 18:23:01 +00:00
|
|
|
{
|
|
|
|
if( item->Type() != SCH_COMPONENT_T )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
component = (SCH_COMPONENT*) item;
|
|
|
|
|
2016-02-15 20:17:51 +00:00
|
|
|
if( aReference.CmpNoCase( component->GetRef( aSheetPath ) ) == 0 )
|
2011-03-28 18:23:01 +00:00
|
|
|
{
|
|
|
|
// Found: Init Footprint Field
|
|
|
|
|
|
|
|
/* Give a reasonable value to the field position and
|
|
|
|
* orientation, if the text is empty at position 0, because
|
|
|
|
* it is probably not yet initialized
|
|
|
|
*/
|
2011-08-19 13:08:24 +00:00
|
|
|
SCH_FIELD * fpfield = component->GetField( FOOTPRINT );
|
2013-03-18 19:36:07 +00:00
|
|
|
if( fpfield->GetText().IsEmpty()
|
2017-01-23 20:30:11 +00:00
|
|
|
&& ( fpfield->GetTextPos() == component->GetPosition() ) )
|
2011-03-28 18:23:01 +00:00
|
|
|
{
|
2017-01-23 20:30:11 +00:00
|
|
|
fpfield->SetTextAngle( component->GetField( VALUE )->GetTextAngle() );
|
|
|
|
fpfield->SetTextPos( component->GetField( VALUE )->GetTextPos() );
|
|
|
|
fpfield->SetTextSize( component->GetField( VALUE )->GetTextSize() );
|
2011-12-07 20:19:29 +00:00
|
|
|
|
2017-01-23 20:30:11 +00:00
|
|
|
if( fpfield->GetTextAngle() == 0.0 )
|
2019-12-30 18:28:00 +00:00
|
|
|
fpfield->Offset( wxPoint( 0, Mils2iu( 100 ) ) );
|
2011-08-19 13:08:24 +00:00
|
|
|
else
|
2019-12-30 18:28:00 +00:00
|
|
|
fpfield->Offset( wxPoint( Mils2iu( 100 ), 0 ) );
|
2011-03-28 18:23:01 +00:00
|
|
|
}
|
|
|
|
|
2013-03-18 19:36:07 +00:00
|
|
|
fpfield->SetText( aFootPrint );
|
|
|
|
fpfield->SetVisible( aSetVisible );
|
2011-03-28 18:23:01 +00:00
|
|
|
|
|
|
|
found = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return found;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-03-11 21:32:05 +00:00
|
|
|
void SCH_SCREEN::AddBusAlias( std::shared_ptr<BUS_ALIAS> aAlias )
|
|
|
|
{
|
|
|
|
m_aliases.insert( aAlias );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool SCH_SCREEN::IsBusAlias( const wxString& aLabel )
|
|
|
|
{
|
|
|
|
SCH_SHEET_LIST aSheets( g_RootSheet );
|
|
|
|
for( unsigned i = 0; i < aSheets.size(); i++ )
|
|
|
|
{
|
2019-12-05 15:20:59 +00:00
|
|
|
for( const auto& alias : aSheets[i].LastScreen()->GetBusAliases() )
|
2019-03-11 21:32:05 +00:00
|
|
|
{
|
|
|
|
if( alias->GetName() == aLabel )
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::shared_ptr<BUS_ALIAS> SCH_SCREEN::GetBusAlias( const wxString& aLabel )
|
|
|
|
{
|
|
|
|
SCH_SHEET_LIST aSheets( g_RootSheet );
|
|
|
|
for( unsigned i = 0; i < aSheets.size(); i++ )
|
|
|
|
{
|
|
|
|
for( auto alias : aSheets[i].LastScreen()->GetBusAliases() )
|
|
|
|
{
|
|
|
|
if( alias->GetName() == aLabel )
|
|
|
|
{
|
|
|
|
return alias;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-11-17 17:00:04 +00:00
|
|
|
#if defined(DEBUG)
|
|
|
|
void SCH_SCREEN::Show( int nestLevel, std::ostream& os ) const
|
|
|
|
{
|
|
|
|
// for now, make it look like XML, expand on this later.
|
|
|
|
NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << ">\n";
|
|
|
|
|
|
|
|
for( EDA_ITEM* item = m_drawList.begin(); item; item = item->Next() )
|
|
|
|
{
|
|
|
|
item->Show( nestLevel+1, os );
|
|
|
|
}
|
|
|
|
|
|
|
|
NestedSpace( nestLevel, os ) << "</" << GetClass().Lower().mb_str() << ">\n";
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
SCH_SCREENS::SCH_SCREENS( SCH_SHEET* aSheet )
|
2008-04-12 18:39:20 +00:00
|
|
|
{
|
2010-10-26 20:25:48 +00:00
|
|
|
m_index = 0;
|
2017-11-17 17:00:04 +00:00
|
|
|
buildScreenList( ( !aSheet ) ? g_RootSheet : aSheet );
|
2008-04-12 18:39:20 +00:00
|
|
|
}
|
|
|
|
|
2009-12-02 21:44:03 +00:00
|
|
|
|
2010-10-26 20:25:48 +00:00
|
|
|
SCH_SCREENS::~SCH_SCREENS()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SCH_SCREEN* SCH_SCREENS::GetFirst()
|
2007-06-05 12:10:51 +00:00
|
|
|
{
|
2010-10-26 20:25:48 +00:00
|
|
|
m_index = 0;
|
|
|
|
|
|
|
|
if( m_screens.size() > 0 )
|
|
|
|
return m_screens[0];
|
|
|
|
|
2008-02-26 19:19:54 +00:00
|
|
|
return NULL;
|
2007-06-05 12:10:51 +00:00
|
|
|
}
|
|
|
|
|
2008-02-26 19:19:54 +00:00
|
|
|
|
2010-10-26 20:25:48 +00:00
|
|
|
SCH_SCREEN* SCH_SCREENS::GetNext()
|
2007-06-05 12:10:51 +00:00
|
|
|
{
|
2010-10-26 20:25:48 +00:00
|
|
|
if( m_index < m_screens.size() )
|
|
|
|
m_index++;
|
|
|
|
|
|
|
|
return GetScreen( m_index );
|
2007-06-05 12:10:51 +00:00
|
|
|
}
|
|
|
|
|
2007-08-20 01:20:48 +00:00
|
|
|
|
2014-04-30 19:16:22 +00:00
|
|
|
SCH_SCREEN* SCH_SCREENS::GetScreen( unsigned int aIndex ) const
|
2007-06-05 12:10:51 +00:00
|
|
|
{
|
2010-10-26 20:25:48 +00:00
|
|
|
if( aIndex < m_screens.size() )
|
|
|
|
return m_screens[ aIndex ];
|
|
|
|
|
2008-02-26 19:19:54 +00:00
|
|
|
return NULL;
|
2008-02-12 21:12:46 +00:00
|
|
|
}
|
2008-02-26 19:19:54 +00:00
|
|
|
|
|
|
|
|
2017-11-17 17:00:04 +00:00
|
|
|
void SCH_SCREENS::addScreenToList( SCH_SCREEN* aScreen )
|
2008-02-12 21:12:46 +00:00
|
|
|
{
|
2010-10-26 20:25:48 +00:00
|
|
|
if( aScreen == NULL )
|
2008-02-26 19:19:54 +00:00
|
|
|
return;
|
2010-10-26 20:25:48 +00:00
|
|
|
|
|
|
|
for( unsigned int i = 0; i < m_screens.size(); i++ )
|
2008-02-26 19:19:54 +00:00
|
|
|
{
|
2010-10-26 20:25:48 +00:00
|
|
|
if( m_screens[i] == aScreen )
|
2008-02-26 19:19:54 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2010-10-26 20:25:48 +00:00
|
|
|
m_screens.push_back( aScreen );
|
2007-06-05 12:10:51 +00:00
|
|
|
}
|
2008-02-26 19:19:54 +00:00
|
|
|
|
|
|
|
|
2017-11-17 17:00:04 +00:00
|
|
|
void SCH_SCREENS::buildScreenList( SCH_SHEET* aSheet )
|
2008-02-12 21:12:46 +00:00
|
|
|
{
|
2017-11-17 17:00:04 +00:00
|
|
|
if( aSheet && aSheet->Type() == SCH_SHEET_T )
|
2008-02-26 19:19:54 +00:00
|
|
|
{
|
2017-11-17 17:00:04 +00:00
|
|
|
SCH_SCREEN* screen = aSheet->GetScreen();
|
2010-12-08 20:12:46 +00:00
|
|
|
|
2017-11-17 17:00:04 +00:00
|
|
|
addScreenToList( screen );
|
2014-08-18 16:39:51 +00:00
|
|
|
|
2010-12-08 20:12:46 +00:00
|
|
|
EDA_ITEM* strct = screen->GetDrawItems();
|
|
|
|
|
2008-02-26 19:19:54 +00:00
|
|
|
while( strct )
|
|
|
|
{
|
2010-12-10 19:47:44 +00:00
|
|
|
if( strct->Type() == SCH_SHEET_T )
|
2008-02-26 19:19:54 +00:00
|
|
|
{
|
2017-11-17 17:00:04 +00:00
|
|
|
buildScreenList( ( SCH_SHEET* )strct );
|
2008-02-26 19:19:54 +00:00
|
|
|
}
|
2010-12-08 20:12:46 +00:00
|
|
|
|
2008-11-24 06:53:43 +00:00
|
|
|
strct = strct->Next();
|
2008-02-26 19:19:54 +00:00
|
|
|
}
|
|
|
|
}
|
2008-02-12 21:12:46 +00:00
|
|
|
}
|
2010-12-31 19:47:39 +00:00
|
|
|
|
|
|
|
|
2016-02-15 20:22:45 +00:00
|
|
|
void SCH_SCREENS::ClearAnnotation()
|
|
|
|
{
|
|
|
|
for( size_t i = 0; i < m_screens.size(); i++ )
|
|
|
|
m_screens[i]->ClearAnnotation( NULL );
|
|
|
|
}
|
|
|
|
|
2018-09-03 10:11:39 +00:00
|
|
|
|
|
|
|
void SCH_SCREENS::ClearAnnotationOfNewSheetPaths( SCH_SHEET_LIST& aInitialSheetPathList )
|
|
|
|
{
|
|
|
|
// Clear the annotation for the components inside new sheetpaths
|
|
|
|
// not already in aInitialSheetList
|
|
|
|
SCH_SCREENS screensList( g_RootSheet ); // The list of screens, shared by sheet paths
|
|
|
|
screensList.BuildClientSheetPathList(); // build the shared by sheet paths, by screen
|
|
|
|
|
|
|
|
// Search for new sheet paths, not existing in aInitialSheetPathList
|
|
|
|
// and existing in sheetpathList
|
|
|
|
SCH_SHEET_LIST sheetpathList( g_RootSheet );
|
|
|
|
|
|
|
|
for( SCH_SHEET_PATH& sheetpath: sheetpathList )
|
|
|
|
{
|
|
|
|
bool path_exists = false;
|
|
|
|
|
|
|
|
for( const SCH_SHEET_PATH& existing_sheetpath: aInitialSheetPathList )
|
|
|
|
{
|
|
|
|
if( existing_sheetpath.Path() == sheetpath.Path() )
|
|
|
|
{
|
|
|
|
path_exists = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if( !path_exists )
|
|
|
|
{
|
|
|
|
// A new sheet path is found: clear the annotation corresponding to this new path:
|
|
|
|
SCH_SCREEN* curr_screen = sheetpath.LastScreen();
|
2018-09-04 16:46:03 +00:00
|
|
|
|
2018-09-03 10:11:39 +00:00
|
|
|
// Clear annotation and create the AR for this path, if not exists,
|
|
|
|
// when the screen is shared by sheet paths.
|
|
|
|
// Otherwise ClearAnnotation do nothing, because the F1 field is used as
|
|
|
|
// reference default value and takes the latest displayed value
|
|
|
|
curr_screen->EnsureAlternateReferencesExist();
|
|
|
|
curr_screen->ClearAnnotation( &sheetpath );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-12-31 19:47:39 +00:00
|
|
|
int SCH_SCREENS::ReplaceDuplicateTimeStamps()
|
|
|
|
{
|
2011-03-25 19:16:05 +00:00
|
|
|
EDA_ITEMS items;
|
2019-10-29 07:49:15 +00:00
|
|
|
int count = 0;
|
|
|
|
|
|
|
|
auto timestamp_cmp = []( const EDA_ITEM* a, const EDA_ITEM* b ) -> bool
|
|
|
|
{
|
|
|
|
return a->GetTimeStamp() < b->GetTimeStamp();
|
|
|
|
};
|
|
|
|
|
|
|
|
std::set<EDA_ITEM*, decltype( timestamp_cmp )> unique_stamps( timestamp_cmp );
|
2010-12-31 19:47:39 +00:00
|
|
|
|
|
|
|
for( size_t i = 0; i < m_screens.size(); i++ )
|
|
|
|
m_screens[i]->GetHierarchicalItems( items );
|
|
|
|
|
|
|
|
if( items.size() < 2 )
|
|
|
|
return 0;
|
|
|
|
|
2019-10-29 07:49:15 +00:00
|
|
|
for( auto item : items )
|
2010-12-31 19:47:39 +00:00
|
|
|
{
|
2019-10-29 07:49:15 +00:00
|
|
|
int failed = 0;
|
2010-12-31 19:47:39 +00:00
|
|
|
|
2019-10-29 07:49:15 +00:00
|
|
|
while( !unique_stamps.insert( item ).second )
|
2010-12-31 19:47:39 +00:00
|
|
|
{
|
2019-10-29 07:49:15 +00:00
|
|
|
failed = 1;
|
2010-12-31 19:47:39 +00:00
|
|
|
|
|
|
|
// for a component, update its Time stamp and its paths
|
|
|
|
// (m_PathsAndReferences field)
|
|
|
|
if( item->Type() == SCH_COMPONENT_T )
|
2019-10-29 07:49:15 +00:00
|
|
|
static_cast<SCH_COMPONENT*>( item )->SetTimeStamp( GetNewTimeStamp() );
|
2010-12-31 19:47:39 +00:00
|
|
|
|
|
|
|
// for a sheet, update only its time stamp (annotation of its
|
|
|
|
// components will be lost)
|
|
|
|
// @todo: see how to change sheet paths for its cmp list (can
|
|
|
|
// be possible in most cases)
|
|
|
|
else
|
2011-12-12 08:37:05 +00:00
|
|
|
item->SetTimeStamp( GetNewTimeStamp() );
|
2010-12-31 19:47:39 +00:00
|
|
|
}
|
2019-10-29 07:49:15 +00:00
|
|
|
|
|
|
|
count += failed;
|
2010-12-31 19:47:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return count;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-07-29 12:18:53 +00:00
|
|
|
void SCH_SCREENS::DeleteAllMarkers( enum MARKER_BASE::TYPEMARKER aMarkerType )
|
2011-03-10 19:36:30 +00:00
|
|
|
{
|
|
|
|
SCH_ITEM* item;
|
|
|
|
SCH_ITEM* nextItem;
|
|
|
|
SCH_MARKER* marker;
|
|
|
|
SCH_SCREEN* screen;
|
|
|
|
|
Modular KiCad Blueprint Milestone B), major portions:
*) When kicad.exe closes a project, close any open KIFACEs so that they cannot
get disassociated from their true PROJECT.
*) Allow loading eeschema library editor from kicad.exe
*) Allow loading pcbnew library editor from kicad.exe
*) Rename LIB_COMPONENT to LIB_PART.
*) Add class PART_LIBS, and PART_LIB.
*) Make PART_LIBS non-global, i.e. PROJECT specific.
*) Implement "data on demand" for PART_LIBS
*) Implement "data on demand" for schematic SEARCH_STACK.
*) Use RSTRINGs to retain eeschema editor's notion of last library and part being edited.
*) Get rid of library search on every SCH_COMPONENT::Draw() call, instead use
a weak pointer.
*) Remove all chdir() calls so projects don't need to be CWD.
*) Romove APPEND support from OpenProjectFiles().
*) Make OpenProjectFiles() robust, even for creating new projects.
*) Load EESCHEMA colors in the KIWAY::OnKiwayStart() rather in window open,
and save them in the .eeschema config file, not in the project file.
*) Fix bug with wxDir() while accessing protected dirs in kicad.exe
*) Consolidate template copying into PROJECT class, not in kicad.exe source.
*) Generally untangle eeschema, making its libraries not global but rather
held in the PROJECT.
2014-08-13 20:28:54 +00:00
|
|
|
for( screen = GetFirst(); screen; screen = GetNext() )
|
2011-03-10 19:36:30 +00:00
|
|
|
{
|
Modular KiCad Blueprint Milestone B), major portions:
*) When kicad.exe closes a project, close any open KIFACEs so that they cannot
get disassociated from their true PROJECT.
*) Allow loading eeschema library editor from kicad.exe
*) Allow loading pcbnew library editor from kicad.exe
*) Rename LIB_COMPONENT to LIB_PART.
*) Add class PART_LIBS, and PART_LIB.
*) Make PART_LIBS non-global, i.e. PROJECT specific.
*) Implement "data on demand" for PART_LIBS
*) Implement "data on demand" for schematic SEARCH_STACK.
*) Use RSTRINGs to retain eeschema editor's notion of last library and part being edited.
*) Get rid of library search on every SCH_COMPONENT::Draw() call, instead use
a weak pointer.
*) Remove all chdir() calls so projects don't need to be CWD.
*) Romove APPEND support from OpenProjectFiles().
*) Make OpenProjectFiles() robust, even for creating new projects.
*) Load EESCHEMA colors in the KIWAY::OnKiwayStart() rather in window open,
and save them in the .eeschema config file, not in the project file.
*) Fix bug with wxDir() while accessing protected dirs in kicad.exe
*) Consolidate template copying into PROJECT class, not in kicad.exe source.
*) Generally untangle eeschema, making its libraries not global but rather
held in the PROJECT.
2014-08-13 20:28:54 +00:00
|
|
|
for( item = screen->GetDrawItems(); item; item = nextItem )
|
2011-03-10 19:36:30 +00:00
|
|
|
{
|
|
|
|
nextItem = item->Next();
|
|
|
|
|
|
|
|
if( item->Type() != SCH_MARKER_T )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
marker = (SCH_MARKER*) item;
|
|
|
|
|
|
|
|
if( marker->GetMarkerType() != aMarkerType )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
screen->DeleteItem( marker );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2011-10-07 14:41:30 +00:00
|
|
|
|
|
|
|
|
2015-07-29 18:06:45 +00:00
|
|
|
int SCH_SCREENS::GetMarkerCount( enum MARKER_BASE::TYPEMARKER aMarkerType,
|
|
|
|
enum MARKER_BASE::MARKER_SEVERITY aSeverity )
|
2011-10-07 14:41:30 +00:00
|
|
|
{
|
|
|
|
int count = 0;
|
|
|
|
|
2015-07-29 12:18:53 +00:00
|
|
|
for( SCH_SCREEN* screen = GetFirst(); screen; screen = GetNext() )
|
2011-10-07 14:41:30 +00:00
|
|
|
{
|
2015-07-29 12:18:53 +00:00
|
|
|
for( SCH_ITEM* item = screen->GetDrawItems(); item; item = item->Next() )
|
2011-10-07 14:41:30 +00:00
|
|
|
{
|
|
|
|
if( item->Type() != SCH_MARKER_T )
|
|
|
|
continue;
|
|
|
|
|
2015-07-29 12:18:53 +00:00
|
|
|
SCH_MARKER* marker = (SCH_MARKER*) item;
|
2011-10-07 14:41:30 +00:00
|
|
|
|
2015-07-29 12:18:53 +00:00
|
|
|
if( ( aMarkerType != MARKER_BASE::MARKER_UNSPEC ) &&
|
|
|
|
( marker->GetMarkerType() != aMarkerType ) )
|
2011-10-07 14:41:30 +00:00
|
|
|
continue;
|
|
|
|
|
2015-07-29 18:06:45 +00:00
|
|
|
if( aSeverity == MARKER_BASE::MARKER_SEVERITY_UNSPEC ||
|
|
|
|
aSeverity == marker->GetErrorLevel() )
|
2015-07-29 12:18:53 +00:00
|
|
|
count++;
|
2011-10-07 14:41:30 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return count;
|
|
|
|
}
|
2011-12-22 21:57:50 +00:00
|
|
|
|
2017-03-04 19:49:55 +00:00
|
|
|
|
2017-10-22 00:48:25 +00:00
|
|
|
void SCH_SCREENS::UpdateSymbolLinks( bool aForce )
|
2017-03-04 19:49:55 +00:00
|
|
|
{
|
|
|
|
for( SCH_SCREEN* screen = GetFirst(); screen; screen = GetNext() )
|
2017-10-22 00:48:25 +00:00
|
|
|
screen->UpdateSymbolLinks( aForce );
|
2019-12-11 23:53:10 +00:00
|
|
|
|
|
|
|
SCH_SHEET_LIST sheets( g_RootSheet );
|
|
|
|
|
|
|
|
// All of the library symbols have been replaced with copies so the connection graph
|
|
|
|
// pointer are stale.
|
2019-12-17 23:42:22 +00:00
|
|
|
if( g_ConnectionGraph )
|
|
|
|
g_ConnectionGraph->Recalculate( sheets, true );
|
2017-03-04 19:49:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-03-10 14:36:55 +00:00
|
|
|
void SCH_SCREENS::TestDanglingEnds()
|
|
|
|
{
|
2019-04-06 01:14:15 +00:00
|
|
|
std::vector<SCH_SCREEN*> screens;
|
2017-03-10 14:36:55 +00:00
|
|
|
for( SCH_SCREEN* screen = GetFirst(); screen; screen = GetNext() )
|
2019-04-06 01:14:15 +00:00
|
|
|
screens.push_back( screen );
|
|
|
|
|
|
|
|
size_t parallelThreadCount = std::min<size_t>( std::thread::hardware_concurrency(),
|
|
|
|
screens.size() );
|
|
|
|
|
|
|
|
std::atomic<size_t> nextScreen( 0 );
|
|
|
|
std::vector<std::future<size_t>> returns( parallelThreadCount );
|
|
|
|
|
|
|
|
auto update_lambda = [&screens, &nextScreen]() -> size_t
|
|
|
|
{
|
|
|
|
for( auto i = nextScreen++; i < screens.size(); i = nextScreen++ )
|
|
|
|
screens[i]->TestDanglingEnds();
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
};
|
|
|
|
|
|
|
|
if( parallelThreadCount == 1 )
|
|
|
|
update_lambda();
|
|
|
|
else
|
|
|
|
{
|
|
|
|
for( size_t ii = 0; ii < parallelThreadCount; ++ii )
|
|
|
|
returns[ii] = std::async( std::launch::async, update_lambda );
|
|
|
|
|
|
|
|
// Finalize the threads
|
|
|
|
for( size_t ii = 0; ii < parallelThreadCount; ++ii )
|
|
|
|
returns[ii].wait();
|
|
|
|
}
|
2017-03-10 14:36:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-03-05 22:31:31 +00:00
|
|
|
bool SCH_SCREENS::HasNoFullyDefinedLibIds()
|
|
|
|
{
|
|
|
|
SCH_COMPONENT* symbol;
|
|
|
|
SCH_ITEM* item;
|
|
|
|
SCH_ITEM* nextItem;
|
|
|
|
SCH_SCREEN* screen;
|
2017-10-06 18:07:43 +00:00
|
|
|
unsigned cnt = 0;
|
2017-03-05 22:31:31 +00:00
|
|
|
|
|
|
|
for( screen = GetFirst(); screen; screen = GetNext() )
|
|
|
|
{
|
|
|
|
for( item = screen->GetDrawItems(); item; item = nextItem )
|
|
|
|
{
|
|
|
|
nextItem = item->Next();
|
|
|
|
|
|
|
|
if( item->Type() != SCH_COMPONENT_T )
|
|
|
|
continue;
|
|
|
|
|
2017-10-06 18:07:43 +00:00
|
|
|
cnt += 1;
|
2017-03-05 22:31:31 +00:00
|
|
|
symbol = dynamic_cast< SCH_COMPONENT* >( item );
|
2018-01-06 05:02:28 +00:00
|
|
|
wxASSERT( symbol );
|
2017-03-05 22:31:31 +00:00
|
|
|
|
|
|
|
if( !symbol->GetLibId().GetLibNickname().empty() )
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-10-06 18:07:43 +00:00
|
|
|
if( cnt == 0 )
|
|
|
|
return false;
|
|
|
|
|
2017-03-05 22:31:31 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-11-17 17:00:04 +00:00
|
|
|
size_t SCH_SCREENS::GetLibNicknames( wxArrayString& aLibNicknames )
|
2011-12-22 21:57:50 +00:00
|
|
|
{
|
2017-11-17 17:00:04 +00:00
|
|
|
SCH_COMPONENT* symbol;
|
|
|
|
SCH_ITEM* item;
|
|
|
|
SCH_ITEM* nextItem;
|
|
|
|
SCH_SCREEN* screen;
|
|
|
|
wxString nickname;
|
2011-12-22 21:57:50 +00:00
|
|
|
|
2017-11-17 17:00:04 +00:00
|
|
|
for( screen = GetFirst(); screen; screen = GetNext() )
|
2011-12-22 21:57:50 +00:00
|
|
|
{
|
2017-11-17 17:00:04 +00:00
|
|
|
for( item = screen->GetDrawItems(); item; item = nextItem )
|
|
|
|
{
|
|
|
|
nextItem = item->Next();
|
|
|
|
|
|
|
|
if( item->Type() != SCH_COMPONENT_T )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
symbol = dynamic_cast< SCH_COMPONENT* >( item );
|
2018-01-06 05:02:28 +00:00
|
|
|
wxASSERT( symbol );
|
2017-11-17 17:00:04 +00:00
|
|
|
|
2019-01-03 16:49:25 +00:00
|
|
|
if( !symbol )
|
|
|
|
continue;
|
|
|
|
|
2017-11-17 17:00:04 +00:00
|
|
|
nickname = symbol->GetLibId().GetLibNickname();
|
|
|
|
|
|
|
|
if( !nickname.empty() && ( aLibNicknames.Index( nickname ) == wxNOT_FOUND ) )
|
|
|
|
aLibNicknames.Add( nickname );;
|
|
|
|
}
|
2011-12-22 21:57:50 +00:00
|
|
|
}
|
|
|
|
|
2017-11-17 17:00:04 +00:00
|
|
|
return aLibNicknames.GetCount();
|
2011-12-22 21:57:50 +00:00
|
|
|
}
|
2017-11-17 17:00:04 +00:00
|
|
|
|
|
|
|
|
|
|
|
int SCH_SCREENS::ChangeSymbolLibNickname( const wxString& aFrom, const wxString& aTo )
|
|
|
|
{
|
|
|
|
SCH_COMPONENT* symbol;
|
|
|
|
SCH_ITEM* item;
|
|
|
|
SCH_ITEM* nextItem;
|
|
|
|
SCH_SCREEN* screen;
|
|
|
|
int cnt = 0;
|
|
|
|
|
|
|
|
for( screen = GetFirst(); screen; screen = GetNext() )
|
|
|
|
{
|
|
|
|
for( item = screen->GetDrawItems(); item; item = nextItem )
|
|
|
|
{
|
|
|
|
nextItem = item->Next();
|
|
|
|
|
|
|
|
if( item->Type() != SCH_COMPONENT_T )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
symbol = dynamic_cast< SCH_COMPONENT* >( item );
|
2018-01-06 05:02:28 +00:00
|
|
|
wxASSERT( symbol );
|
2017-11-17 17:00:04 +00:00
|
|
|
|
|
|
|
if( symbol->GetLibId().GetLibNickname() != aFrom )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
LIB_ID id = symbol->GetLibId();
|
|
|
|
id.SetLibNickname( aTo );
|
|
|
|
symbol->SetLibId( id );
|
|
|
|
cnt++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return cnt;
|
|
|
|
}
|
2018-09-03 10:11:39 +00:00
|
|
|
|
|
|
|
|
2019-07-19 15:39:29 +00:00
|
|
|
bool SCH_SCREENS::HasSchematic( const wxString& aSchematicFileName )
|
|
|
|
{
|
|
|
|
for( const SCH_SCREEN* screen = GetFirst(); screen; screen = GetNext() )
|
|
|
|
{
|
|
|
|
if( screen->GetFileName() == aSchematicFileName )
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-11-17 16:43:05 +00:00
|
|
|
bool SCH_SCREENS::CanCauseCaseSensitivityIssue( const wxString& aSchematicFileName ) const
|
|
|
|
{
|
2019-11-19 21:06:18 +00:00
|
|
|
wxString lhsLower;
|
|
|
|
wxString rhsLower;
|
2019-11-17 16:43:05 +00:00
|
|
|
wxFileName lhs;
|
|
|
|
wxFileName rhs = aSchematicFileName;
|
|
|
|
|
|
|
|
wxCHECK( rhs.IsAbsolute(), false );
|
|
|
|
|
|
|
|
for( const SCH_SCREEN* screen : m_screens )
|
|
|
|
{
|
|
|
|
lhs = screen->GetFileName();
|
|
|
|
|
|
|
|
if( lhs.GetPath() != rhs.GetPath() )
|
|
|
|
continue;
|
|
|
|
|
2019-12-12 17:30:35 +00:00
|
|
|
lhsLower = lhs.GetFullName().Lower();
|
|
|
|
rhsLower = rhs.GetFullName().Lower();
|
2019-11-19 21:06:18 +00:00
|
|
|
|
2019-12-12 17:30:35 +00:00
|
|
|
if( lhsLower == rhsLower && lhs.GetFullName() != rhs.GetFullName() )
|
2019-11-17 16:43:05 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-09-03 10:11:39 +00:00
|
|
|
void SCH_SCREENS::BuildClientSheetPathList()
|
|
|
|
{
|
|
|
|
SCH_SHEET_LIST sheetList( g_RootSheet );
|
|
|
|
|
|
|
|
for( SCH_SCREEN* curr_screen = GetFirst(); curr_screen; curr_screen = GetNext() )
|
|
|
|
curr_screen->GetClientSheetPaths().Clear();
|
|
|
|
|
|
|
|
for( SCH_SHEET_PATH& sheetpath: sheetList )
|
|
|
|
{
|
|
|
|
SCH_SCREEN* used_screen = sheetpath.LastScreen();
|
|
|
|
|
|
|
|
// SEarch for the used_screen in list and add this unique sheet path:
|
|
|
|
for( SCH_SCREEN* curr_screen = GetFirst(); curr_screen; curr_screen = GetNext() )
|
|
|
|
{
|
|
|
|
if( used_screen == curr_screen )
|
|
|
|
{
|
|
|
|
curr_screen->GetClientSheetPaths().Add( sheetpath.Path() );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|