diff --git a/CMakeModules/FindwxWidgets.cmake b/CMakeModules/FindwxWidgets.cmake index 5a21f75f41..9a6e56f7bb 100644 --- a/CMakeModules/FindwxWidgets.cmake +++ b/CMakeModules/FindwxWidgets.cmake @@ -1,86 +1,109 @@ -# - Find a wxWidgets (a.k.a., wxWindows) installation. +#.rst: +# FindwxWidgets +# ------------- +# +# Find a wxWidgets (a.k.a., wxWindows) installation. +# # This module finds if wxWidgets is installed and selects a default -# configuration to use. wxWidgets is a modular library. To specify the -# modules that you will use, you need to name them as components to -# the package: +# configuration to use. wxWidgets is a modular library. To specify the +# modules that you will use, you need to name them as components to the +# package: # # find_package(wxWidgets COMPONENTS core base ...) # -# There are two search branches: a windows style and a unix style. For -# windows, the following variables are searched for and set to -# defaults in case of multiple choices. Change them if the defaults -# are not desired (i.e., these are the only variables you should -# change to select a configuration): +# There are two search branches: a windows style and a unix style. For +# windows, the following variables are searched for and set to defaults +# in case of multiple choices. Change them if the defaults are not +# desired (i.e., these are the only variables you should change to +# select a configuration): # -# wxWidgets_ROOT_DIR - Base wxWidgets directory -# (e.g., C:/wxWidgets-2.6.3). -# wxWidgets_LIB_DIR - Path to wxWidgets libraries -# (e.g., C:/wxWidgets-2.6.3/lib/vc_lib). -# wxWidgets_CONFIGURATION - Configuration to use -# (e.g., msw, mswd, mswu, mswunivud, etc.) -# wxWidgets_EXCLUDE_COMMON_LIBRARIES -# - Set to TRUE to exclude linking of -# commonly required libs (e.g., png tiff -# jpeg zlib regex expat). +# :: # -# For unix style it uses the wx-config utility. You can select between +# wxWidgets_ROOT_DIR - Base wxWidgets directory +# (e.g., C:/wxWidgets-2.6.3). +# wxWidgets_LIB_DIR - Path to wxWidgets libraries +# (e.g., C:/wxWidgets-2.6.3/lib/vc_lib). +# wxWidgets_CONFIGURATION - Configuration to use +# (e.g., msw, mswd, mswu, mswunivud, etc.) +# wxWidgets_EXCLUDE_COMMON_LIBRARIES +# - Set to TRUE to exclude linking of +# commonly required libs (e.g., png tiff +# jpeg zlib regex expat). +# +# +# +# For unix style it uses the wx-config utility. You can select between # debug/release, unicode/ansi, universal/non-universal, and # static/shared in the QtDialog or ccmake interfaces by turning ON/OFF # the following variables: # -# wxWidgets_USE_DEBUG -# wxWidgets_USE_UNICODE -# wxWidgets_USE_UNIVERSAL -# wxWidgets_USE_STATIC +# :: +# +# wxWidgets_USE_DEBUG +# wxWidgets_USE_UNICODE +# wxWidgets_USE_UNIVERSAL +# wxWidgets_USE_STATIC +# +# # # There is also a wxWidgets_CONFIG_OPTIONS variable for all other -# options that need to be passed to the wx-config utility. For -# example, to use the base toolkit found in the /usr/local path, set -# the variable (before calling the FIND_PACKAGE command) as such: +# options that need to be passed to the wx-config utility. For example, +# to use the base toolkit found in the /usr/local path, set the variable +# (before calling the FIND_PACKAGE command) as such: # -# set(wxWidgets_CONFIG_OPTIONS --toolkit=base --prefix=/usr) +# :: +# +# set(wxWidgets_CONFIG_OPTIONS --toolkit=base --prefix=/usr) +# +# +# +# The following are set after the configuration is done for both windows +# and unix style: +# +# :: +# +# wxWidgets_FOUND - Set to TRUE if wxWidgets was found. +# wxWidgets_INCLUDE_DIRS - Include directories for WIN32 +# i.e., where to find "wx/wx.h" and +# "wx/setup.h"; possibly empty for unices. +# wxWidgets_LIBRARIES - Path to the wxWidgets libraries. +# wxWidgets_LIBRARY_DIRS - compile time link dirs, useful for +# rpath on UNIX. Typically an empty string +# in WIN32 environment. +# wxWidgets_DEFINITIONS - Contains defines required to compile/link +# against WX, e.g. WXUSINGDLL +# wxWidgets_DEFINITIONS_DEBUG- Contains defines required to compile/link +# against WX debug builds, e.g. __WXDEBUG__ +# wxWidgets_CXX_FLAGS - Include dirs and compiler flags for +# unices, empty on WIN32. Essentially +# "`wx-config --cxxflags`". +# wxWidgets_USE_FILE - Convenience include file. # -# The following are set after the configuration is done for both -# windows and unix style: # -# wxWidgets_FOUND - Set to TRUE if wxWidgets was found. -# wxWidgets_INCLUDE_DIRS - Include directories for WIN32 -# i.e., where to find "wx/wx.h" and -# "wx/setup.h"; possibly empty for unices. -# wxWidgets_LIBRARIES - Path to the wxWidgets libraries. -# wxWidgets_LIBRARY_DIRS - compile time link dirs, useful for -# rpath on UNIX. Typically an empty string -# in WIN32 environment. -# wxWidgets_DEFINITIONS - Contains defines required to compile/link -# against WX, e.g. WXUSINGDLL -# wxWidgets_DEFINITIONS_DEBUG- Contains defines required to compile/link -# against WX debug builds, e.g. __WXDEBUG__ -# wxWidgets_CXX_FLAGS - Include dirs and compiler flags for -# unices, empty on WIN32. Essentially -# "`wx-config --cxxflags`". -# wxWidgets_USE_FILE - Convenience include file. # # Sample usage: -# # Note that for MinGW users the order of libs is important! -# find_package(wxWidgets COMPONENTS net gl core base) -# if(wxWidgets_FOUND) -# include(${wxWidgets_USE_FILE}) -# # and for each of your dependent executable/library targets: -# target_link_libraries( ${wxWidgets_LIBRARIES}) -# endif(wxWidgets_FOUND) +# +# :: +# +# # Note that for MinGW users the order of libs is important! +# find_package(wxWidgets COMPONENTS net gl core base) +# if(wxWidgets_FOUND) +# include(${wxWidgets_USE_FILE}) +# # and for each of your dependent executable/library targets: +# target_link_libraries( ${wxWidgets_LIBRARIES}) +# endif() +# +# # # If wxWidgets is required (i.e., not an optional part): -# find_package(wxWidgets REQUIRED net gl core base) -# include(${wxWidgets_USE_FILE}) -# # and for each of your dependent executable/library targets: -# target_link_libraries( ${wxWidgets_LIBRARIES}) # -# If a wxWidgets version or greater is required: -# find_package(wxWidgets 2.8.12 COMPONENTS net gl core base REQUIRED) -# -# If specific wxWidgets version is required: -# find_package(wxWidgets 2.8.12 EXACT COMPONENTS net gl core base REQUIRED) +# :: # +# find_package(wxWidgets REQUIRED net gl core base) +# include(${wxWidgets_USE_FILE}) +# # and for each of your dependent executable/library targets: +# target_link_libraries( ${wxWidgets_LIBRARIES}) + #============================================================================= # Copyright 2004-2009 Kitware, Inc. # Copyright 2007-2009 Miguel A. Figueroa-Villanueva @@ -144,17 +167,19 @@ # checking whether a minimal set was found. -# FIXME: This and all the dbg_msg calls should be removed after the +# FIXME: This and all the DBG_MSG calls should be removed after the # module stabilizes. # # Helper macro to control the debugging output globally. There are # two versions for controlling how verbose your output should be. -macro(dbg_msg _MSG) -# message(STATUS "${_MSG}") -endmacro(dbg_msg) -macro(dbg_msg_v _MSG) -# message(STATUS "${_MSG}") -endmacro(dbg_msg_v) +macro(DBG_MSG _MSG) +# message(STATUS +# "${CMAKE_CURRENT_LIST_FILE}(${CMAKE_CURRENT_LIST_LINE}): ${_MSG}") +endmacro() +macro(DBG_MSG_V _MSG) +# message(STATUS +# "${CMAKE_CURRENT_LIST_FILE}(${CMAKE_CURRENT_LIST_LINE}): ${_MSG}") +endmacro() # Clear return values in case the module is loaded more than once. set(wxWidgets_FOUND FALSE) @@ -171,8 +196,8 @@ set(wxWidgets_CXX_FLAGS "") # - else set wxWidgets_FIND_COMPONENTS to wxWidgets_USE_LIBS if(wxWidgets_USE_LIBS AND NOT wxWidgets_FIND_COMPONENTS) set(wxWidgets_FIND_COMPONENTS ${wxWidgets_USE_LIBS}) -endif(wxWidgets_USE_LIBS AND NOT wxWidgets_FIND_COMPONENTS) -dbg_msg("wxWidgets_FIND_COMPONENTS : ${wxWidgets_FIND_COMPONENTS}") +endif() +DBG_MSG("wxWidgets_FIND_COMPONENTS : ${wxWidgets_FIND_COMPONENTS}") # Add the convenience use file if available. # @@ -187,30 +212,23 @@ get_filename_component( if(EXISTS "${wxWidgets_CURRENT_LIST_DIR}/UsewxWidgets.cmake") set(wxWidgets_USE_FILE "${wxWidgets_CURRENT_LIST_DIR}/UsewxWidgets.cmake") -else(EXISTS "${wxWidgets_CURRENT_LIST_DIR}/UsewxWidgets.cmake") +else() set(wxWidgets_USE_FILE UsewxWidgets) -endif(EXISTS "${wxWidgets_CURRENT_LIST_DIR}/UsewxWidgets.cmake") +endif() #===================================================================== +# Determine whether unix or win32 paths should be used #===================================================================== - - if(WIN32 AND NOT CYGWIN AND NOT MSYS AND NOT CMAKE_HOST_UNIX ) - dbg_msg( "setting win32 style" ) set(wxWidgets_FIND_STYLE "win32") else() - if(CMAKE_HOST_UNIX OR MSYS) - dbg_msg( "unix style" ) - set(wxWidgets_FIND_STYLE "unix") - endif() + set(wxWidgets_FIND_STYLE "unix") endif() #===================================================================== # WIN32_FIND_STYLE #===================================================================== if(wxWidgets_FIND_STYLE STREQUAL "win32") - dbg_msg("Using win32 path") - # Useful common wx libs needed by almost all components. set(wxWidgets_COMMON_LIBRARIES png tiff jpeg zlib regex expat) @@ -218,17 +236,17 @@ if(wxWidgets_FIND_STYLE STREQUAL "win32") if(NOT wxWidgets_FIND_COMPONENTS) if(wxWidgets_USE_MONOLITHIC) set(wxWidgets_FIND_COMPONENTS mono) - else(wxWidgets_USE_MONOLITHIC) + else() set(wxWidgets_FIND_COMPONENTS core base) # this is default - endif(wxWidgets_USE_MONOLITHIC) - endif(NOT wxWidgets_FIND_COMPONENTS) + endif() + endif() # Add the common (usually required libs) unless # wxWidgets_EXCLUDE_COMMON_LIBRARIES has been set. if(NOT wxWidgets_EXCLUDE_COMMON_LIBRARIES) list(APPEND wxWidgets_FIND_COMPONENTS ${wxWidgets_COMMON_LIBRARIES}) - endif(NOT wxWidgets_EXCLUDE_COMMON_LIBRARIES) + endif() #------------------------------------------------------------------- # WIN32: Helper MACROS @@ -238,22 +256,22 @@ if(wxWidgets_FIND_STYLE STREQUAL "win32") # if _CONFIGURATION = mswunivud, then _UNV=univ, _UCD=u _DBG=d # if _CONFIGURATION = mswu, then _UNV="", _UCD=u _DBG="" # - macro(wx_get_name_components _CONFIGURATION _UNV _UCD _DBG) + macro(WX_GET_NAME_COMPONENTS _CONFIGURATION _UNV _UCD _DBG) string(REGEX MATCH "univ" ${_UNV} "${_CONFIGURATION}") string(REGEX REPLACE "msw.*(u)[d]*$" "u" ${_UCD} "${_CONFIGURATION}") if(${_UCD} STREQUAL ${_CONFIGURATION}) set(${_UCD} "") - endif(${_UCD} STREQUAL ${_CONFIGURATION}) + endif() string(REGEX MATCH "d$" ${_DBG} "${_CONFIGURATION}") - endmacro(wx_get_name_components) + endmacro() # # Find libraries associated to a configuration. # - macro(wx_find_libs _UNV _UCD _DBG) - dbg_msg_v("m_unv = ${_UNV}") - dbg_msg_v("m_ucd = ${_UCD}") - dbg_msg_v("m_dbg = ${_DBG}") + macro(WX_FIND_LIBS _UNV _UCD _DBG) + DBG_MSG_V("m_unv = ${_UNV}") + DBG_MSG_V("m_ucd = ${_UCD}") + DBG_MSG_V("m_dbg = ${_DBG}") # FIXME: What if both regex libs are available. regex should be # found outside the loop and only wx${LIB}${_UCD}${_DBG}. @@ -266,10 +284,8 @@ if(wxWidgets_FIND_STYLE STREQUAL "win32") PATHS ${WX_LIB_DIR} NO_DEFAULT_PATH ) - mark_as_advanced(WX_${LIB}${_DBG}) - endforeach(LIB) - - dbg_msg( "WX_LIB_DIR:${WX_LIB_DIR}" ) + mark_as_advanced(WX_${LIB}${_DBG}) + endforeach() # Find wxWidgets multilib base libraries. find_library(WX_base${_DBG} @@ -299,7 +315,7 @@ if(wxWidgets_FIND_STYLE STREQUAL "win32") NO_DEFAULT_PATH ) mark_as_advanced(WX_${LIB}${_DBG}) - endforeach(LIB) + endforeach() # Find wxWidgets monolithic library. find_library(WX_mono${_DBG} @@ -332,94 +348,94 @@ if(wxWidgets_FIND_STYLE STREQUAL "win32") NO_DEFAULT_PATH ) mark_as_advanced(WX_${LIB}${_DBG}) - endforeach(LIB) - endmacro(wx_find_libs) + endforeach() + endmacro() # # Clear all library paths, so that FIND_LIBRARY refinds them. # # Clear a lib, reset its found flag, and mark as advanced. - macro(wx_clear_lib _LIB) + macro(WX_CLEAR_LIB _LIB) set(${_LIB} "${_LIB}-NOTFOUND" CACHE FILEPATH "Cleared." FORCE) set(${_LIB}_FOUND FALSE) mark_as_advanced(${_LIB}) - endmacro(wx_clear_lib) + endmacro() # Clear all debug or release library paths (arguments are "d" or ""). - macro(wx_clear_all_libs _DBG) + macro(WX_CLEAR_ALL_LIBS _DBG) # Clear wxWidgets common libraries. foreach(LIB ${wxWidgets_COMMON_LIBRARIES} scintilla) - wx_clear_lib(WX_${LIB}${_DBG}) - endforeach(LIB) + WX_CLEAR_LIB(WX_${LIB}${_DBG}) + endforeach() # Clear wxWidgets multilib base libraries. - wx_clear_lib(WX_base${_DBG}) + WX_CLEAR_LIB(WX_base${_DBG}) foreach(LIB net odbc xml) - wx_clear_lib(WX_${LIB}${_DBG}) - endforeach(LIB) + WX_CLEAR_LIB(WX_${LIB}${_DBG}) + endforeach() # Clear wxWidgets monolithic library. - wx_clear_lib(WX_mono${_DBG}) + WX_CLEAR_LIB(WX_mono${_DBG}) # Clear wxWidgets multilib libraries. foreach(LIB core adv aui html media xrc dbgrid gl qa richtext webview stc ribbon propgrid) - wx_clear_lib(WX_${LIB}${_DBG}) - endforeach(LIB) - endmacro(wx_clear_all_libs) + WX_CLEAR_LIB(WX_${LIB}${_DBG}) + endforeach() + endmacro() # Clear all wxWidgets debug libraries. - macro(wx_clear_all_dbg_libs) - wx_clear_all_libs("d") - endmacro(wx_clear_all_dbg_libs) + macro(WX_CLEAR_ALL_DBG_LIBS) + WX_CLEAR_ALL_LIBS("d") + endmacro() # Clear all wxWidgets release libraries. - macro(wx_clear_all_rel_libs) - wx_clear_all_libs("") - endmacro(wx_clear_all_rel_libs) + macro(WX_CLEAR_ALL_REL_LIBS) + WX_CLEAR_ALL_LIBS("") + endmacro() # # Set the wxWidgets_LIBRARIES variable. # Also, Sets output variable wxWidgets_FOUND to FALSE if it fails. # - macro(wx_set_libraries _LIBS _DBG) - dbg_msg_v("Looking for ${${_LIBS}}") + macro(WX_SET_LIBRARIES _LIBS _DBG) + DBG_MSG_V("Looking for ${${_LIBS}}") if(WX_USE_REL_AND_DBG) foreach(LIB ${${_LIBS}}) - dbg_msg_v("Searching for ${LIB} and ${LIB}d") - dbg_msg_v("WX_${LIB} : ${WX_${LIB}}") - dbg_msg_v("WX_${LIB}d : ${WX_${LIB}d}") + DBG_MSG_V("Searching for ${LIB} and ${LIB}d") + DBG_MSG_V("WX_${LIB} : ${WX_${LIB}}") + DBG_MSG_V("WX_${LIB}d : ${WX_${LIB}d}") if(WX_${LIB} AND WX_${LIB}d) - dbg_msg_v("Found ${LIB} and ${LIB}d") + DBG_MSG_V("Found ${LIB} and ${LIB}d") list(APPEND wxWidgets_LIBRARIES debug ${WX_${LIB}d} optimized ${WX_${LIB}} ) - else(WX_${LIB} AND WX_${LIB}d) - dbg_msg_v("- not found due to missing WX_${LIB}=${WX_${LIB}} or WX_${LIB}d=${WX_${LIB}d}") + else() + DBG_MSG_V("- not found due to missing WX_${LIB}=${WX_${LIB}} or WX_${LIB}d=${WX_${LIB}d}") set(wxWidgets_FOUND FALSE) - endif(WX_${LIB} AND WX_${LIB}d) - endforeach(LIB) - else(WX_USE_REL_AND_DBG) + endif() + endforeach() + else() foreach(LIB ${${_LIBS}}) - dbg_msg_v("Searching for ${LIB}${_DBG}") - dbg_msg_v("WX_${LIB}${_DBG} : ${WX_${LIB}${_DBG}}") + DBG_MSG_V("Searching for ${LIB}${_DBG}") + DBG_MSG_V("WX_${LIB}${_DBG} : ${WX_${LIB}${_DBG}}") if(WX_${LIB}${_DBG}) - dbg_msg_v("Found ${LIB}${_DBG}") + DBG_MSG_V("Found ${LIB}${_DBG}") list(APPEND wxWidgets_LIBRARIES ${WX_${LIB}${_DBG}}) - else(WX_${LIB}${_DBG}) - dbg_msg_v( + else() + DBG_MSG_V( "- not found due to missing WX_${LIB}${_DBG}=${WX_${LIB}${_DBG}}") set(wxWidgets_FOUND FALSE) - endif(WX_${LIB}${_DBG}) - endforeach(LIB) - endif(WX_USE_REL_AND_DBG) + endif() + endforeach() + endif() - dbg_msg_v("OpenGL") + DBG_MSG_V("OpenGL") list(FIND ${_LIBS} gl WX_USE_GL) if(NOT WX_USE_GL EQUAL -1) - dbg_msg_v("- is required.") + DBG_MSG_V("- is required.") list(APPEND wxWidgets_LIBRARIES opengl32 glu32) - endif(NOT WX_USE_GL EQUAL -1) + endif() list(APPEND wxWidgets_LIBRARIES winmm comctl32 rpcrt4 wsock32) - endmacro(wx_set_libraries) + endmacro() #------------------------------------------------------------------- # WIN32: Start actual work. @@ -429,12 +445,12 @@ if(wxWidgets_FIND_STYLE STREQUAL "win32") find_path(wxWidgets_ROOT_DIR NAMES include/wx/wx.h PATHS - $ENV{wxWidgets_ROOT_DIR} - $ENV{WXWIN} + ENV wxWidgets_ROOT_DIR + ENV WXWIN "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\wxWidgets_is1;Inno Setup: App Path]" # WX 2.6.x C:/ D:/ - $ENV{ProgramFiles} + ENV ProgramFiles PATH_SUFFIXES wxWidgets-3.0.2 wxWidgets-3.0.1 @@ -470,33 +486,29 @@ if(wxWidgets_FIND_STYLE STREQUAL "win32") wxWidgets-2.5.2 wxWidgets-2.5.1 wxWidgets - DOC "wxWidgets base/installation directory?" + DOC "wxWidgets base/installation directory" ) # If wxWidgets_ROOT_DIR changed, clear lib dir. if(NOT WX_ROOT_DIR STREQUAL wxWidgets_ROOT_DIR) - dbg_msg( "WX_ROOT_DIR != wxWidgets_ROOT_DIR" ) - set(WX_ROOT_DIR ${wxWidgets_ROOT_DIR} CACHE INTERNAL "wxWidgets_ROOT_DIR") set(wxWidgets_LIB_DIR "wxWidgets_LIB_DIR-NOTFOUND" CACHE PATH "Cleared." FORCE) - endif(NOT WX_ROOT_DIR STREQUAL wxWidgets_ROOT_DIR) + endif() if(WX_ROOT_DIR) - dbg_msg( "WX_ROOT_DIR == wxWidgets_ROOT_DIR" ) - # Select one default tree inside the already determined wx tree. # Prefer static/shared order usually consistent with build # settings. if(MINGW) - dbg_msg( "MINGW" ) set(WX_LIB_DIR_PREFIX gcc) - else(MINGW) + elseif(CMAKE_CL_64) + set(WX_LIB_DIR_PREFIX vc_x64) + else() set(WX_LIB_DIR_PREFIX vc) - endif(MINGW) + endif() if(BUILD_SHARED_LIBS) - dbg_msg( "BUILD_SHARED_LIBS" ) find_path(wxWidgets_LIB_DIR NAMES msw/wx/setup.h @@ -510,11 +522,10 @@ if(wxWidgets_FIND_STYLE STREQUAL "win32") PATHS ${WX_ROOT_DIR}/lib/${WX_LIB_DIR_PREFIX}_dll # prefer shared ${WX_ROOT_DIR}/lib/${WX_LIB_DIR_PREFIX}_lib - DOC "Path to wxWidgets libraries?" + DOC "Path to wxWidgets libraries" NO_DEFAULT_PATH ) - else(BUILD_SHARED_LIBS) - dbg_msg( "!BUILD_SHARED_LIBS WX_LIB_DIR:${WX_LIB_DIR}" ) + else() find_path(wxWidgets_LIB_DIR NAMES msw/wx/setup.h @@ -528,24 +539,24 @@ if(wxWidgets_FIND_STYLE STREQUAL "win32") PATHS ${WX_ROOT_DIR}/lib/${WX_LIB_DIR_PREFIX}_lib # prefer static ${WX_ROOT_DIR}/lib/${WX_LIB_DIR_PREFIX}_dll - DOC "Path to wxWidgets libraries?" + DOC "Path to wxWidgets libraries" NO_DEFAULT_PATH ) - endif(BUILD_SHARED_LIBS) + endif() # If wxWidgets_LIB_DIR changed, clear all libraries. if(NOT WX_LIB_DIR STREQUAL wxWidgets_LIB_DIR) set(WX_LIB_DIR ${wxWidgets_LIB_DIR} CACHE INTERNAL "wxWidgets_LIB_DIR") - wx_clear_all_dbg_libs() - wx_clear_all_rel_libs() - endif(NOT WX_LIB_DIR STREQUAL wxWidgets_LIB_DIR) + WX_CLEAR_ALL_DBG_LIBS() + WX_CLEAR_ALL_REL_LIBS() + endif() if(WX_LIB_DIR) # If building shared libs, define WXUSINGDLL to use dllimport. - if(WX_LIB_DIR MATCHES ".*[dD][lL][lL].*") + if(WX_LIB_DIR MATCHES "[dD][lL][lL]") set(wxWidgets_DEFINITIONS WXUSINGDLL) - dbg_msg_v("detected SHARED/DLL tree WX_LIB_DIR=${WX_LIB_DIR}") - endif(WX_LIB_DIR MATCHES ".*[dD][lL][lL].*") + DBG_MSG_V("detected SHARED/DLL tree WX_LIB_DIR=${WX_LIB_DIR}") + endif() # Search for available configuration types. foreach(CFG mswunivud mswunivd mswud mswd mswunivu mswuniv mswu msw) @@ -554,9 +565,9 @@ if(wxWidgets_FIND_STYLE STREQUAL "win32") list(APPEND WX_CONFIGURATION_LIST ${CFG}) set(WX_${CFG}_FOUND TRUE) set(WX_CONFIGURATION ${CFG}) - endif(EXISTS ${WX_LIB_DIR}/${CFG}) - endforeach(CFG) - dbg_msg_v("WX_CONFIGURATION_LIST=${WX_CONFIGURATION_LIST}") + endif() + endforeach() + DBG_MSG_V("WX_CONFIGURATION_LIST=${WX_CONFIGURATION_LIST}") if(WX_CONFIGURATION) set(wxWidgets_FOUND TRUE) @@ -568,82 +579,78 @@ if(wxWidgets_FIND_STYLE STREQUAL "win32") if(NOT WX_${wxWidgets_CONFIGURATION}_FOUND) set(wxWidgets_CONFIGURATION ${WX_CONFIGURATION} CACHE STRING "Set wxWidgets configuration (${WX_CONFIGURATION_LIST})" FORCE) - else(NOT WX_${wxWidgets_CONFIGURATION}_FOUND) + else() set(wxWidgets_CONFIGURATION ${wxWidgets_CONFIGURATION} CACHE STRING "Set wxWidgets configuration (${WX_CONFIGURATION_LIST})" FORCE) - endif(NOT WX_${wxWidgets_CONFIGURATION}_FOUND) + endif() # If release config selected, and both release/debug exist. if(WX_${wxWidgets_CONFIGURATION}d_FOUND) - OPTION(wxWidgets_USE_REL_AND_DBG + option(wxWidgets_USE_REL_AND_DBG "Use release and debug configurations?" TRUE) set(WX_USE_REL_AND_DBG ${wxWidgets_USE_REL_AND_DBG}) - else(WX_${wxWidgets_CONFIGURATION}d_FOUND) + else() # If the option exists (already in cache), force it false. if(wxWidgets_USE_REL_AND_DBG) set(wxWidgets_USE_REL_AND_DBG FALSE CACHE BOOL "No ${wxWidgets_CONFIGURATION}d found." FORCE) - endif(wxWidgets_USE_REL_AND_DBG) + endif() set(WX_USE_REL_AND_DBG FALSE) - endif(WX_${wxWidgets_CONFIGURATION}d_FOUND) + endif() # Get configuration parameters from the name. - wx_get_name_components(${wxWidgets_CONFIGURATION} UNV UCD DBG) + WX_GET_NAME_COMPONENTS(${wxWidgets_CONFIGURATION} UNV UCD DBG) # Set wxWidgets lib setup include directory. if(EXISTS ${WX_LIB_DIR}/${wxWidgets_CONFIGURATION}/wx/setup.h) set(wxWidgets_INCLUDE_DIRS ${WX_LIB_DIR}/${wxWidgets_CONFIGURATION}) - else(EXISTS ${WX_LIB_DIR}/${wxWidgets_CONFIGURATION}/wx/setup.h) - dbg_msg("wxWidgets_FOUND FALSE because ${WX_LIB_DIR}/${wxWidgets_CONFIGURATION}/wx/setup.h does not exists.") + else() + DBG_MSG("wxWidgets_FOUND FALSE because ${WX_LIB_DIR}/${wxWidgets_CONFIGURATION}/wx/setup.h does not exists.") set(wxWidgets_FOUND FALSE) - endif(EXISTS ${WX_LIB_DIR}/${wxWidgets_CONFIGURATION}/wx/setup.h) + endif() # Set wxWidgets main include directory. if(EXISTS ${WX_ROOT_DIR}/include/wx/wx.h) list(APPEND wxWidgets_INCLUDE_DIRS ${WX_ROOT_DIR}/include) - else(EXISTS ${WX_ROOT_DIR}/include/wx/wx.h) - dbg_msg("wxWidgets_FOUND FALSE because WX_ROOT_DIR=${WX_ROOT_DIR} has no ${WX_ROOT_DIR}/include/wx/wx.h") + else() + DBG_MSG("wxWidgets_FOUND FALSE because WX_ROOT_DIR=${WX_ROOT_DIR} has no ${WX_ROOT_DIR}/include/wx/wx.h") set(wxWidgets_FOUND FALSE) - endif(EXISTS ${WX_ROOT_DIR}/include/wx/wx.h) + endif() # Find wxWidgets libraries. - wx_find_libs("${UNV}" "${UCD}" "${DBG}") + WX_FIND_LIBS("${UNV}" "${UCD}" "${DBG}") if(WX_USE_REL_AND_DBG) - wx_find_libs("${UNV}" "${UCD}" "d") - endif(WX_USE_REL_AND_DBG) + WX_FIND_LIBS("${UNV}" "${UCD}" "d") + endif() # Settings for requested libs (i.e., include dir, libraries, etc.). - wx_set_libraries(wxWidgets_FIND_COMPONENTS "${DBG}") + WX_SET_LIBRARIES(wxWidgets_FIND_COMPONENTS "${DBG}") # Add necessary definitions for unicode builds if("${UCD}" STREQUAL "u") list(APPEND wxWidgets_DEFINITIONS UNICODE _UNICODE) - endif("${UCD}" STREQUAL "u") + endif() # Add necessary definitions for debug builds set(wxWidgets_DEFINITIONS_DEBUG _DEBUG __WXDEBUG__) - endif(WX_CONFIGURATION) - endif(WX_LIB_DIR) - endif(WX_ROOT_DIR) + endif() + endif() + endif() #===================================================================== # UNIX_FIND_STYLE #===================================================================== -else(wxWidgets_FIND_STYLE STREQUAL "win32") - dbg_msg("NOT win32 path") - +else() if(wxWidgets_FIND_STYLE STREQUAL "unix") - dbg_msg("unix find style") - #----------------------------------------------------------------- # UNIX: Helper MACROS #----------------------------------------------------------------- # # Set the default values based on "wx-config --selected-config". # - macro(wx_config_select_get_default) + macro(WX_CONFIG_SELECT_GET_DEFAULT) execute_process( COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}" ${wxWidgets_CONFIG_OPTIONS} --selected-config @@ -654,25 +661,25 @@ else(wxWidgets_FIND_STYLE STREQUAL "win32") if(_wx_result EQUAL 0) foreach(_opt_name debug static unicode universal) string(TOUPPER ${_opt_name} _upper_opt_name) - if(_wx_selected_config MATCHES ".*${_opt_name}.*") + if(_wx_selected_config MATCHES "${_opt_name}") set(wxWidgets_DEFAULT_${_upper_opt_name} ON) - else(_wx_selected_config MATCHES ".*${_opt_name}.*") + else() set(wxWidgets_DEFAULT_${_upper_opt_name} OFF) - endif(_wx_selected_config MATCHES ".*${_opt_name}.*") - endforeach(_opt_name) - else(_wx_result EQUAL 0) + endif() + endforeach() + else() foreach(_upper_opt_name DEBUG STATIC UNICODE UNIVERSAL) set(wxWidgets_DEFAULT_${_upper_opt_name} OFF) - endforeach(_upper_opt_name) - endif(_wx_result EQUAL 0) - endmacro(wx_config_select_get_default) + endforeach() + endif() + endmacro() # # Query a boolean configuration option to determine if the system # has both builds available. If so, provide the selection option # to the user. # - macro(wx_config_select_query_bool _OPT_NAME _OPT_HELP) + macro(WX_CONFIG_SELECT_QUERY_BOOL _OPT_NAME _OPT_HELP) execute_process( COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}" ${wxWidgets_CONFIG_OPTIONS} --${_OPT_NAME}=yes @@ -689,43 +696,45 @@ else(wxWidgets_FIND_STYLE STREQUAL "win32") ) string(TOUPPER ${_OPT_NAME} _UPPER_OPT_NAME) if(_wx_result_yes EQUAL 0 AND _wx_result_no EQUAL 0) - OPTION(wxWidgets_USE_${_UPPER_OPT_NAME} + option(wxWidgets_USE_${_UPPER_OPT_NAME} ${_OPT_HELP} ${wxWidgets_DEFAULT_${_UPPER_OPT_NAME}}) - else(_wx_result_yes EQUAL 0 AND _wx_result_no EQUAL 0) + else() # If option exists (already in cache), force to available one. if(DEFINED wxWidgets_USE_${_UPPER_OPT_NAME}) if(_wx_result_yes EQUAL 0) set(wxWidgets_USE_${_UPPER_OPT_NAME} ON CACHE BOOL ${_OPT_HELP} FORCE) - else(_wx_result_yes EQUAL 0) + else() set(wxWidgets_USE_${_UPPER_OPT_NAME} OFF CACHE BOOL ${_OPT_HELP} FORCE) - endif(_wx_result_yes EQUAL 0) - endif(DEFINED wxWidgets_USE_${_UPPER_OPT_NAME}) - endif(_wx_result_yes EQUAL 0 AND _wx_result_no EQUAL 0) - endmacro(wx_config_select_query_bool) + endif() + endif() + endif() + endmacro() # # Set wxWidgets_SELECT_OPTIONS to wx-config options for selecting # among multiple builds. # - macro(wx_config_select_set_options) + macro(WX_CONFIG_SELECT_SET_OPTIONS) set(wxWidgets_SELECT_OPTIONS ${wxWidgets_CONFIG_OPTIONS}) foreach(_opt_name debug static unicode universal) string(TOUPPER ${_opt_name} _upper_opt_name) if(DEFINED wxWidgets_USE_${_upper_opt_name}) if(wxWidgets_USE_${_upper_opt_name}) list(APPEND wxWidgets_SELECT_OPTIONS --${_opt_name}=yes) - else(wxWidgets_USE_${_upper_opt_name}) + else() list(APPEND wxWidgets_SELECT_OPTIONS --${_opt_name}=no) - endif(wxWidgets_USE_${_upper_opt_name}) - endif(DEFINED wxWidgets_USE_${_upper_opt_name}) - endforeach(_opt_name) - endmacro(wx_config_select_set_options) + endif() + endif() + endforeach() + endmacro() #----------------------------------------------------------------- # UNIX: Start actual work. #----------------------------------------------------------------- # Support cross-compiling, only search in the target platform. - find_program(wxWidgets_CONFIG_EXECUTABLE wx-config + find_program(wxWidgets_CONFIG_EXECUTABLE + NAMES wx-config wx-config-3.1 wx-config-3.0 wx-config-2.9 wx-config-2.8 + DOC "Location of wxWidgets library configuration provider binary (wx-config)." ONLY_CMAKE_FIND_ROOT_PATH ) @@ -733,17 +742,17 @@ else(wxWidgets_FIND_STYLE STREQUAL "win32") set(wxWidgets_FOUND TRUE) # get defaults based on "wx-config --selected-config" - wx_config_select_get_default() + WX_CONFIG_SELECT_GET_DEFAULT() # for each option: if both builds are available, provide option - wx_config_select_query_bool(debug "Use debug build?") - wx_config_select_query_bool(unicode "Use unicode build?") - wx_config_select_query_bool(universal "Use universal build?") - wx_config_select_query_bool(static "Link libraries statically?") + WX_CONFIG_SELECT_QUERY_BOOL(debug "Use debug build?") + WX_CONFIG_SELECT_QUERY_BOOL(unicode "Use unicode build?") + WX_CONFIG_SELECT_QUERY_BOOL(universal "Use universal build?") + WX_CONFIG_SELECT_QUERY_BOOL(static "Link libraries statically?") # process selection to set wxWidgets_SELECT_OPTIONS - wx_config_select_set_options() - dbg_msg("wxWidgets_SELECT_OPTIONS=${wxWidgets_SELECT_OPTIONS}") + WX_CONFIG_SELECT_SET_OPTIONS() + DBG_MSG("wxWidgets_SELECT_OPTIONS=${wxWidgets_SELECT_OPTIONS}") # run the wx-config program to get cxxflags execute_process( @@ -757,7 +766,7 @@ else(wxWidgets_FIND_STYLE STREQUAL "win32") string(STRIP "${wxWidgets_CXX_FLAGS}" wxWidgets_CXX_FLAGS) separate_arguments(wxWidgets_CXX_FLAGS) - dbg_msg_v("wxWidgets_CXX_FLAGS=${wxWidgets_CXX_FLAGS}") + DBG_MSG_V("wxWidgets_CXX_FLAGS=${wxWidgets_CXX_FLAGS}") # parse definitions from cxxflags; # drop -D* from CXXFLAGS and the -D prefix @@ -782,14 +791,14 @@ else(wxWidgets_FIND_STYLE STREQUAL "win32") string(REPLACE ";" " " wxWidgets_CXX_FLAGS "${wxWidgets_CXX_FLAGS}") - dbg_msg_v("wxWidgets_DEFINITIONS=${wxWidgets_DEFINITIONS}") - dbg_msg_v("wxWidgets_INCLUDE_DIRS=${wxWidgets_INCLUDE_DIRS}") - dbg_msg_v("wxWidgets_CXX_FLAGS=${wxWidgets_CXX_FLAGS}") + DBG_MSG_V("wxWidgets_DEFINITIONS=${wxWidgets_DEFINITIONS}") + DBG_MSG_V("wxWidgets_INCLUDE_DIRS=${wxWidgets_INCLUDE_DIRS}") + DBG_MSG_V("wxWidgets_CXX_FLAGS=${wxWidgets_CXX_FLAGS}") - else(RET EQUAL 0) + else() set(wxWidgets_FOUND FALSE) - dbg_msg_v("${wxWidgets_CONFIG_EXECUTABLE} --cxxflags FAILED with RET=${RET}") - endif(RET EQUAL 0) + DBG_MSG_V("${wxWidgets_CONFIG_EXECUTABLE} --cxxflags FAILED with RET=${RET}") + endif() # run the wx-config program to get the libs # - NOTE: wx-config doesn't verify that the libs requested exist @@ -820,21 +829,21 @@ else(wxWidgets_FIND_STYLE STREQUAL "win32") string(REPLACE "-L" "" wxWidgets_LIBRARY_DIRS "${wxWidgets_LIBRARY_DIRS}") - dbg_msg_v("wxWidgets_LIBRARIES=${wxWidgets_LIBRARIES}") - dbg_msg_v("wxWidgets_LIBRARY_DIRS=${wxWidgets_LIBRARY_DIRS}") + DBG_MSG_V("wxWidgets_LIBRARIES=${wxWidgets_LIBRARIES}") + DBG_MSG_V("wxWidgets_LIBRARY_DIRS=${wxWidgets_LIBRARY_DIRS}") - else(RET EQUAL 0) + else() set(wxWidgets_FOUND FALSE) - dbg_msg("${wxWidgets_CONFIG_EXECUTABLE} --libs ${wxWidgets_FIND_COMPONENTS} FAILED with RET=${RET}") - endif(RET EQUAL 0) - endif(wxWidgets_CONFIG_EXECUTABLE) + DBG_MSG("${wxWidgets_CONFIG_EXECUTABLE} --libs ${wxWidgets_FIND_COMPONENTS} FAILED with RET=${RET}") + endif() + endif() # When using wx-config in MSYS, the include paths are UNIX style paths which may or may # not work correctly depending on you MSYS/MinGW configuration. CMake expects native # paths internally. if(wxWidgets_FOUND AND MSYS) find_program(_cygpath_exe cygpath ONLY_CMAKE_FIND_ROOT_PATH) - dbg_msg_v("_cygpath_exe: ${_cygpath_exe}") + DBG_MSG_V("_cygpath_exe: ${_cygpath_exe}") if(_cygpath_exe) set(_tmp_path "") foreach(_path ${wxWidgets_INCLUDE_DIRS}) @@ -847,11 +856,11 @@ else(wxWidgets_FIND_STYLE STREQUAL "win32") ) if(_retv EQUAL 0) file(TO_CMAKE_PATH ${_native_path} _native_path) - dbg_msg_v("Path ${_path} converted to ${_native_path}") + DBG_MSG_V("Path ${_path} converted to ${_native_path}") set(_tmp_path "${_tmp_path} ${_native_path}") endif() endforeach() - dbg_msg("Setting wxWidgets_INCLUDE_DIRS = ${_tmp_path}") + DBG_MSG("Setting wxWidgets_INCLUDE_DIRS = ${_tmp_path}") set(wxWidgets_INCLUDE_DIRS ${_tmp_path}) separate_arguments(wxWidgets_INCLUDE_DIRS) list(REMOVE_ITEM wxWidgets_INCLUDE_DIRS "") @@ -860,22 +869,21 @@ else(wxWidgets_FIND_STYLE STREQUAL "win32") #===================================================================== # Neither UNIX_FIND_STYLE, nor WIN32_FIND_STYLE #===================================================================== - else(wxWidgets_FIND_STYLE STREQUAL "unix") + else() if(NOT wxWidgets_FIND_QUIETLY) message(STATUS "${CMAKE_CURRENT_LIST_FILE}(${CMAKE_CURRENT_LIST_LINE}): \n" " Platform unknown/unsupported. It's neither WIN32 nor UNIX " "find style." ) - endif(NOT wxWidgets_FIND_QUIETLY) - endif(wxWidgets_FIND_STYLE STREQUAL "unix") -endif(wxWidgets_FIND_STYLE STREQUAL "win32") - + endif() + endif() +endif() # Check if a specfic version was requested by find_package(). -if(wxWidgets_FOUND AND wxWidgets_FIND_VERSION) +if(wxWidgets_FOUND) find_file(_filename wx/version.h PATHS ${wxWidgets_INCLUDE_DIRS} NO_DEFAULT_PATH) - dbg_msg("_filename: ${_filename}") + DBG_MSG("_filename: ${_filename}") if(NOT _filename) message(FATAL_ERROR "wxWidgets wx/version.h file not found in ${wxWidgets_INCLUDE_DIRS}.") @@ -883,40 +891,35 @@ if(wxWidgets_FOUND AND wxWidgets_FIND_VERSION) file(READ ${_filename} _wx_version_h) - string(REGEX REPLACE "^(.*\n)?#define wxMAJOR_VERSION[ ]+([0-9]+).*" + string(REGEX REPLACE "^(.*\n)?#define +wxMAJOR_VERSION +([0-9]+).*" "\\2" wxWidgets_VERSION_MAJOR "${_wx_version_h}" ) - string(REGEX REPLACE "^(.*\n)?#define wxMINOR_VERSION[ ]+([0-9]+).*" + string(REGEX REPLACE "^(.*\n)?#define +wxMINOR_VERSION +([0-9]+).*" "\\2" wxWidgets_VERSION_MINOR "${_wx_version_h}" ) - string(REGEX REPLACE "^(.*\n)?#define wxRELEASE_NUMBER[ ]+([0-9]+).*" + string(REGEX REPLACE "^(.*\n)?#define +wxRELEASE_NUMBER +([0-9]+).*" "\\2" wxWidgets_VERSION_PATCH "${_wx_version_h}" ) set(wxWidgets_VERSION_STRING "${wxWidgets_VERSION_MAJOR}.${wxWidgets_VERSION_MINOR}.${wxWidgets_VERSION_PATCH}" ) - dbg_msg("wxWidgets_VERSION_STRING: ${wxWidgets_VERSION_STRING}") + DBG_MSG("wxWidgets_VERSION_STRING: ${wxWidgets_VERSION_STRING}") endif() - # Debug output: -dbg_msg("wxWidgets_FOUND : ${wxWidgets_FOUND}") -dbg_msg("wxWidgets_INCLUDE_DIRS : ${wxWidgets_INCLUDE_DIRS}") -dbg_msg("wxWidgets_LIBRARY_DIRS : ${wxWidgets_LIBRARY_DIRS}") -dbg_msg("wxWidgets_LIBRARIES : ${wxWidgets_LIBRARIES}") -dbg_msg("wxWidgets_CXX_FLAGS : ${wxWidgets_CXX_FLAGS}") -dbg_msg("wxWidgets_USE_FILE : ${wxWidgets_USE_FILE}") -dbg_msg("wxWidgets_FIND_VERSION : ${wxWidgets_FIND_VERSION}") -dbg_msg("wxWidgets_VERSION_MAJOR : ${wxWidgets_VERSION_MAJOR}") -dbg_msg("wxWidgets_VERSION_MINOR : ${wxWidgets_VERSION_MINOR}") -dbg_msg("wxWidgets_VERSION_PATCH : ${wxWidgets_VERSION_PATCH}") +DBG_MSG("wxWidgets_FOUND : ${wxWidgets_FOUND}") +DBG_MSG("wxWidgets_INCLUDE_DIRS : ${wxWidgets_INCLUDE_DIRS}") +DBG_MSG("wxWidgets_LIBRARY_DIRS : ${wxWidgets_LIBRARY_DIRS}") +DBG_MSG("wxWidgets_LIBRARIES : ${wxWidgets_LIBRARIES}") +DBG_MSG("wxWidgets_CXX_FLAGS : ${wxWidgets_CXX_FLAGS}") +DBG_MSG("wxWidgets_USE_FILE : ${wxWidgets_USE_FILE}") +DBG_MSG("wxWidgets_FIND_VERSION : ${wxWidgets_FIND_VERSION}") +DBG_MSG("wxWidgets_VERSION_MAJOR : ${wxWidgets_VERSION_MAJOR}") +DBG_MSG("wxWidgets_VERSION_MINOR : ${wxWidgets_VERSION_MINOR}") +DBG_MSG("wxWidgets_VERSION_PATCH : ${wxWidgets_VERSION_PATCH}") #===================================================================== #===================================================================== -# Maintain consistency with all other variables. -dbg_msg("wxWidgets_FOUND : ${wxWidgets_FOUND}") -set(WXWIDGETS_FOUND ${wxWidgetsS_FOUND}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(wxWidgets - FOUND_VAR wxWidgets_FOUND REQUIRED_VARS wxWidgets_LIBRARIES wxWidgets_INCLUDE_DIRS VERSION_VAR wxWidgets_VERSION_STRING ) @@ -932,21 +935,22 @@ find_package_handle_standard_args(wxWidgets # Resource file compiler. find_program(wxWidgets_wxrc_EXECUTABLE wxrc ${wxWidgets_ROOT_DIR}/utils/wxrc/vc_msw + DOC "Location of wxWidgets resource file compiler binary (wxrc)" ) # -# wx_split_arguments_on( ...) +# WX_SPLIT_ARGUMENTS_ON( ...) # # Sets and to contain arguments to the left and right, # respectively, of . # # Example usage: -# function(wxwidgets_add_resources outfiles) -# wx_split_arguments_on(OPTIONS wxrc_files wxrc_options ${ARGN}) +# function(WXWIDGETS_ADD_RESOURCES outfiles) +# WX_SPLIT_ARGUMENTS_ON(OPTIONS wxrc_files wxrc_options ${ARGN}) # ... -# endfunction(wxwidgets_add_resources) +# endfunction() # -# wxwidgets_add_resources(sources ${xrc_files} OPTIONS -e -o file.C) +# WXWIDGETS_ADD_RESOURCES(sources ${xrc_files} OPTIONS -e -o file.C) # # NOTE: This is a generic piece of code that should be renamed to # SPLIT_ARGUMENTS_ON and put in a file serving the same purpose as @@ -955,7 +959,7 @@ find_program(wxWidgets_wxrc_EXECUTABLE wxrc # here a bit more generalized. So, there are already two find modules # using this approach. # -function(wx_split_arguments_on _keyword _leftvar _rightvar) +function(WX_SPLIT_ARGUMENTS_ON _keyword _leftvar _rightvar) # FIXME: Document that the input variables will be cleared. #list(APPEND ${_leftvar} "") #list(APPEND ${_rightvar} "") @@ -966,21 +970,21 @@ function(wx_split_arguments_on _keyword _leftvar _rightvar) foreach(element ${ARGN}) if("${element}" STREQUAL "${_keyword}") set(_doing_right TRUE) - else("${element}" STREQUAL "${_keyword}") + else() if(_doing_right) list(APPEND ${_rightvar} "${element}") - else(_doing_right) + else() list(APPEND ${_leftvar} "${element}") - endif(_doing_right) - endif("${element}" STREQUAL "${_keyword}") - endforeach(element) + endif() + endif() + endforeach() set(${_leftvar} ${${_leftvar}} PARENT_SCOPE) set(${_rightvar} ${${_rightvar}} PARENT_SCOPE) -endfunction(wx_split_arguments_on) +endfunction() # -# wx_get_dependencies_from_xml( +# WX_GET_DEPENDENCIES_FROM_XML( # # # @@ -990,7 +994,7 @@ endfunction(wx_split_arguments_on) # # FIXME: Add documentation here... # -function(wx_get_dependencies_from_xml +function(WX_GET_DEPENDENCIES_FROM_XML _depends _match_patt _clean_patt @@ -1009,28 +1013,28 @@ function(wx_get_dependencies_from_xml # make the file have an absolute path if(NOT IS_ABSOLUTE "${dep_file}") set(dep_file "${${_depends_path}}/${dep_file}") - endif(NOT IS_ABSOLUTE "${dep_file}") + endif() # append file to dependency list list(APPEND ${_depends} "${dep_file}") - endforeach(dep_file) + endforeach() set(${_depends} ${${_depends}} PARENT_SCOPE) -endfunction(wx_get_dependencies_from_xml) +endfunction() # -# wxwidgets_add_resources( +# WXWIDGETS_ADD_RESOURCES( # OPTIONS [NO_CPP_CODE]) # # Adds a custom command for resource file compilation of the # and appends the output files to . # # Example usages: -# wxwidgets_add_resources(sources xrc/main_frame.xrc) -# wxwidgets_add_resources(sources ${xrc_files} OPTIONS -e -o altname.cxx) +# WXWIDGETS_ADD_RESOURCES(sources xrc/main_frame.xrc) +# WXWIDGETS_ADD_RESOURCES(sources ${xrc_files} OPTIONS -e -o altname.cxx) # -function(wxwidgets_add_resources _outfiles) - wx_split_arguments_on(OPTIONS rc_file_list rc_options ${ARGN}) +function(WXWIDGETS_ADD_RESOURCES _outfiles) + WX_SPLIT_ARGUMENTS_ON(OPTIONS rc_file_list rc_options ${ARGN}) # Parse files for dependencies. set(rc_file_list_abs "") @@ -1046,7 +1050,7 @@ function(wxwidgets_add_resources _outfiles) file(READ "${rc_file_abs}" rc_file_contents) # get bitmap/bitmap2 files - wx_get_dependencies_from_xml( + WX_GET_DEPENDENCIES_FROM_XML( rc_depends "]*>" @@ -1055,7 +1059,7 @@ function(wxwidgets_add_resources _outfiles) ) # get url files - wx_get_dependencies_from_xml( + WX_GET_DEPENDENCIES_FROM_XML( rc_depends "]*>" @@ -1064,14 +1068,14 @@ function(wxwidgets_add_resources _outfiles) ) # get wxIcon files - wx_get_dependencies_from_xml( + WX_GET_DEPENDENCIES_FROM_XML( rc_depends "]*class=\"wxIcon\"[^<]+" "^]*>" rc_file_contents depends_path ) - endforeach(rc_file) + endforeach() # # Parse options. @@ -1083,31 +1087,31 @@ function(wxwidgets_add_resources _outfiles) list(APPEND rc_options --cpp-code) # wxrc's default output filename for cpp code. set(outfile resource.cpp) - else(index EQUAL -1) + else() list(REMOVE_AT rc_options ${index}) # wxrc's default output filename for xrs file. set(outfile resource.xrs) - endif(index EQUAL -1) + endif() # Get output name for use in add_custom_command. # - short option scanning list(FIND rc_options -o index) if(NOT index EQUAL -1) - MATH(EXPR filename_index "${index} + 1") + math(EXPR filename_index "${index} + 1") list(GET rc_options ${filename_index} outfile) #list(REMOVE_AT rc_options ${index} ${filename_index}) - endif(NOT index EQUAL -1) + endif() # - long option scanning string(REGEX MATCH "--output=[^;]*" outfile_opt "${rc_options}") if(outfile_opt) string(REPLACE "--output=" "" outfile "${outfile_opt}") - endif(outfile_opt) + endif() #string(REGEX REPLACE "--output=[^;]*;?" "" rc_options "${rc_options}") #string(REGEX REPLACE ";$" "" rc_options "${rc_options}") if(NOT IS_ABSOLUTE "${outfile}") set(outfile "${CMAKE_CURRENT_BINARY_DIR}/${outfile}") - endif(NOT IS_ABSOLUTE "${outfile}") + endif() add_custom_command( OUTPUT "${outfile}" COMMAND ${wxWidgets_wxrc_EXECUTABLE} ${rc_options} ${rc_file_list_abs} @@ -1124,10 +1128,10 @@ function(wxwidgets_add_resources _outfiles) set_source_files_properties( "${outfile_header}" PROPERTIES GENERATED TRUE ) - endif(NOT short_index EQUAL -1 OR NOT long_index EQUAL -1) + endif() # Add generated file to output file list. list(APPEND ${_outfiles} "${outfile}") set(${_outfiles} ${${_outfiles}} PARENT_SCOPE) -endfunction(wxwidgets_add_resources) +endfunction() diff --git a/common/draw_panel_gal.cpp b/common/draw_panel_gal.cpp index cccc5dd357..5e97c37ca8 100644 --- a/common/draw_panel_gal.cpp +++ b/common/draw_panel_gal.cpp @@ -182,20 +182,27 @@ void EDA_DRAW_PANEL_GAL::Refresh( bool aEraseBackground, const wxRect* aRect ) if( m_pendingRefresh ) return; + m_pendingRefresh = true; + +#ifdef __WXMAC__ + // Timers on OS X may have a high latency (seen up to 500ms and more) which + // makes repaints jerky. No negative impact seen without throttling, so just + // do an unconditional refresh for OS X. + ForceRefresh(); +#else wxLongLong t = wxGetLocalTimeMillis(); wxLongLong delta = t - m_lastRefresh; if( delta >= MinRefreshPeriod ) { ForceRefresh(); - m_pendingRefresh = true; } else { // One shot timer m_refreshTimer.Start( ( MinRefreshPeriod - delta ).ToLong(), true ); - m_pendingRefresh = true; } +#endif } diff --git a/eeschema/annotate.cpp b/eeschema/annotate.cpp index a0b2ab472b..1b2a27d232 100644 --- a/eeschema/annotate.cpp +++ b/eeschema/annotate.cpp @@ -6,7 +6,7 @@ /* * This program source code file is part of KiCad, a free EDA CAD application. * - * Copyright (C) 2004-2015 KiCad Developers, see change_log.txt for contributors. + * Copyright (C) 2004-2013 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 @@ -33,25 +33,25 @@ #include #include -#include #include -#include -#include - +#include void SCH_EDIT_FRAME::DeleteAnnotation( bool aCurrentSheetOnly ) { if( aCurrentSheetOnly ) { - m_CurrentSheet->Last()->ClearAnnotation(); + SCH_SCREEN* screen = GetScreen(); + wxCHECK_RET( screen != NULL, wxT( "Attempt to clear annotation of a NULL screen." ) ); + screen->ClearAnnotation( m_CurrentSheet ); } else { - m_CurrentSheet->Last()->GetRootSheet()->ClearAnnotation( true ); + SCH_SCREENS ScreenList; + ScreenList.ClearAnnotation(); } // Update the references for the sheet that is currently being displayed. - m_CurrentSheet->Last()->UpdateAllScreenReferences(); + m_CurrentSheet->UpdateAllScreenReferences(); GetCanvas()->Refresh(); OnModify(); } @@ -94,11 +94,11 @@ void SCH_EDIT_FRAME::AnnotateComponents( bool aAnnotateSchematic, { if( aAnnotateSchematic ) { - g_RootSheet->GetMultiUnitComponents( Prj().SchLibs(), lockedComponents ); + sheets.GetMultiUnitComponents( Prj().SchLibs(), lockedComponents ); } else { - m_CurrentSheet->Last()->GetMultiUnitComponents( Prj().SchLibs(), lockedComponents ); + m_CurrentSheet->GetMultiUnitComponents( Prj().SchLibs(), lockedComponents ); } } @@ -112,11 +112,11 @@ void SCH_EDIT_FRAME::AnnotateComponents( bool aAnnotateSchematic, // Build component list if( aAnnotateSchematic ) { - g_RootSheet->GetComponents( Prj().SchLibs(), references ); + sheets.GetComponents( Prj().SchLibs(), references ); } else { - m_CurrentSheet->Last()->GetComponents( Prj().SchLibs(), references, true, false ); + m_CurrentSheet->GetComponents( Prj().SchLibs(), references ); } // Break full components reference in name (prefix) and number: @@ -177,7 +177,7 @@ void SCH_EDIT_FRAME::AnnotateComponents( bool aAnnotateSchematic, OnModify(); // Update on screen references, that can be modified by previous calculations: - m_CurrentSheet->Last()->UpdateAllScreenReferences(); + m_CurrentSheet->UpdateAllScreenReferences(); SetSheetNumberAndCount(); m_canvas->Refresh( true ); @@ -187,13 +187,14 @@ void SCH_EDIT_FRAME::AnnotateComponents( bool aAnnotateSchematic, int SCH_EDIT_FRAME::CheckAnnotate( wxArrayString* aMessageList, bool aOneSheetOnly ) { // build the screen list + SCH_SHEET_LIST SheetList; SCH_REFERENCE_LIST ComponentsList; // Build the list of components if( !aOneSheetOnly ) - g_RootSheet->GetComponents( Prj().SchLibs(), ComponentsList ); + SheetList.GetComponents( Prj().SchLibs(), ComponentsList ); else - m_CurrentSheet->Last()->GetComponents( Prj().SchLibs(), ComponentsList, true, false ); + m_CurrentSheet->GetComponents( Prj().SchLibs(), ComponentsList ); return ComponentsList.CheckAnnotation( aMessageList ); } diff --git a/eeschema/backanno.cpp b/eeschema/backanno.cpp index 75ea87d8ae..671f727bca 100644 --- a/eeschema/backanno.cpp +++ b/eeschema/backanno.cpp @@ -38,10 +38,9 @@ #include #include -#include +#include #include #include -#include #include #include @@ -54,9 +53,10 @@ void SCH_EDIT_FRAME::backAnnotateFootprints( const std::string& aChangedSetOfRef { // Build a flat list of components in schematic: SCH_REFERENCE_LIST refs; + SCH_SHEET_LIST sheets; bool isChanged = false; - g_RootSheet->GetComponents( Prj().SchLibs(), refs, false ); + sheets.GetComponents( Prj().SchLibs(), refs, false ); DSNLEXER lexer( aChangedSetOfReferences, FROM_UTF8( __func__ ) ); PTREE doc; @@ -135,8 +135,9 @@ bool SCH_EDIT_FRAME::ProcessCmpToFootprintLinkFile( const wxString& aFullFilenam { // Build a flat list of components in schematic: SCH_REFERENCE_LIST referencesList; + SCH_SHEET_LIST sheetList; - g_RootSheet->GetComponents( Prj().SchLibs(), referencesList, false ); + sheetList.GetComponents( Prj().SchLibs(), referencesList, false ); FILE* cmpFile = wxFopen( aFullFilename, wxT( "rt" ) ); diff --git a/eeschema/block.cpp b/eeschema/block.cpp index bcc8828e46..9edd9d43fa 100644 --- a/eeschema/block.cpp +++ b/eeschema/block.cpp @@ -475,11 +475,10 @@ void SCH_EDIT_FRAME::PasteListOfItems( wxDC* DC ) if( srcFn.IsRelative() ) srcFn.MakeAbsolute( Prj().GetProjectPath() ); - std::vector< std::vector< const SCH_SHEET* > > sheetHierarchy; - sheet->GetSheetPaths( sheetHierarchy ); + SCH_SHEET_LIST sheetHierarchy( sheet ); - if( g_RootSheet->TestForRecursion( sheetHierarchy, - destFn.GetFullPath( wxPATH_UNIX ) ) ) + if( hierarchy.TestForRecursion( sheetHierarchy, + destFn.GetFullPath( wxPATH_UNIX ) ) ) { wxString msg; diff --git a/eeschema/class_netlist_object.cpp b/eeschema/class_netlist_object.cpp index 1f53224fc9..5d7ca6b41d 100644 --- a/eeschema/class_netlist_object.cpp +++ b/eeschema/class_netlist_object.cpp @@ -357,7 +357,7 @@ wxString NETLIST_OBJECT::GetShortNetName() const if( link ) // Should be always true { netName = wxT("Net-("); - netName << link->GetRef( m_netNameCandidate->m_SheetPath.Last() ); + netName << link->GetRef( &m_netNameCandidate->m_SheetPath ); netName << wxT("-Pad") << LIB_PIN::PinStringNum( m_netNameCandidate->m_PinNum ) << wxT(")"); diff --git a/eeschema/class_sch_screen.h b/eeschema/class_sch_screen.h index 180f925775..67c6451b1c 100644 --- a/eeschema/class_sch_screen.h +++ b/eeschema/class_sch_screen.h @@ -49,7 +49,6 @@ class SCH_SHEET_PIN; class SCH_LINE; class SCH_TEXT; class PLOTTER; -class SCH_SHEET; enum SCH_LINE_TEST_T @@ -426,11 +425,11 @@ public: /** * Function ClearAnnotation - * clears the annotation for the components in \a aSheet on the screen. - * @param aSheet The sheet of the component annotation to clear. If NULL then - * the entire hierarchy is cleared for this screen. + * clears the annotation for the components in \a aSheetPath on the screen. + * @param aSheetPath The sheet path of the component annotation to clear. If NULL then + * the entire hierarchy is cleared. */ - void ClearAnnotation( SCH_SHEET* aSheet ); + void ClearAnnotation( SCH_SHEET_PATH* aSheetPath ); /** * Function GetHierarchicalItems @@ -501,13 +500,13 @@ public: * searches screen for a component with \a aReference and set the footprint field to * \a aFootPrint if found. * - * @param aSheet The sheet used to look up the reference designator. + * @param aSheetPath The sheet path used to look up the reference designator. * @param aReference The reference designator of the component. * @param aFootPrint The value to set the footprint field. * @param aSetVisible The value to set the field visibility flag. * @return True if \a aReference was found otherwise false. */ - bool SetComponentFootprint( SCH_SHEET* aSheet, const wxString& aReference, + bool SetComponentFootprint( SCH_SHEET_PATH* aSheetPath, const wxString& aReference, const wxString& aFootPrint, bool aSetVisible ); /** @@ -550,6 +549,12 @@ public: SCH_SCREEN* GetNext(); SCH_SCREEN* GetScreen( unsigned int aIndex ) const; + /** + * Function ClearAnnotation + * clears the annotation for all components in the hierarchy. + */ + void ClearAnnotation(); + /** * Function SchematicCleanUp * merges and breaks wire segments in the entire schematic hierarchy. diff --git a/eeschema/component_references_lister.cpp b/eeschema/component_references_lister.cpp index 38619e541f..6796ef398a 100644 --- a/eeschema/component_references_lister.cpp +++ b/eeschema/component_references_lister.cpp @@ -7,8 +7,8 @@ * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 1992-2011 jean-pierre Charras - * Copyright (C) 1992-2015 Wayne Stambaugh - * Copyright (C) 1992-2015 KiCad Developers, see change_log.txt for contributors. + * Copyright (C) 1992-2011 Wayne Stambaugh + * Copyright (C) 1992-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 @@ -36,9 +36,8 @@ #include #include #include -#include -#include #include +#include #include @@ -70,7 +69,6 @@ bool SCH_REFERENCE_LIST::sortByXPosition( const SCH_REFERENCE& item1, return ii < 0; } - bool SCH_REFERENCE_LIST::sortByYPosition( const SCH_REFERENCE& item1, const SCH_REFERENCE& item2 ) { @@ -134,9 +132,7 @@ bool SCH_REFERENCE_LIST::sortByReferenceOnly( const SCH_REFERENCE& item1, bool SCH_REFERENCE_LIST::sortByTimeStamp( const SCH_REFERENCE& item1, const SCH_REFERENCE& item2 ) { - wxCHECK( item1.m_Sheet != NULL && item2.m_Sheet != NULL, false ); - - int ii = *item1.m_Sheet - *item2.m_Sheet; + int ii = item1.m_SheetPath.Cmp( item2.m_SheetPath ); if( ii == 0 ) ii = item1.m_TimeStamp - item2.m_TimeStamp; @@ -144,7 +140,6 @@ bool SCH_REFERENCE_LIST::sortByTimeStamp( const SCH_REFERENCE& item1, return ii < 0; } - int SCH_REFERENCE_LIST::FindUnit( size_t aIndex, int aUnit ) { int NumRef; @@ -291,7 +286,7 @@ int SCH_REFERENCE_LIST::CreateFirstFreeRefId( std::vector& aIdList, int aFi void SCH_REFERENCE_LIST::Annotate( bool aUseSheetNum, int aSheetIntervalId, - SCH_MULTI_UNIT_REFERENCE_MAP& aLockedUnitMap ) + SCH_MULTI_UNIT_REFERENCE_MAP aLockedUnitMap ) { if ( componentFlatList.size() == 0 ) return; @@ -337,11 +332,9 @@ void SCH_REFERENCE_LIST::Annotate( bool aUseSheetNum, int aSheetIntervalId, // Check whether this component is in aLockedUnitMap. SCH_REFERENCE_LIST* lockedList = NULL; - BOOST_FOREACH( SCH_MULTI_UNIT_REFERENCE_MAP::value_type& pair, aLockedUnitMap ) { unsigned n_refs = pair.second.GetCount(); - for( unsigned thisRefI = 0; thisRefI < n_refs; ++thisRefI ) { SCH_REFERENCE &thisRef = pair.second[thisRefI]; @@ -421,29 +414,22 @@ void SCH_REFERENCE_LIST::Annotate( bool aUseSheetNum, int aSheetIntervalId, if( lockedList != NULL ) { unsigned n_refs = lockedList->GetCount(); - for( unsigned thisRefI = 0; thisRefI < n_refs; ++thisRefI ) { SCH_REFERENCE &thisRef = (*lockedList)[thisRefI]; - if( thisRef.IsSameInstance( componentFlatList[ii] ) ) { // This is the component we're currently annotating. Hold the unit! componentFlatList[ii].m_Unit = thisRef.m_Unit; } - if( thisRef.CompareValue( componentFlatList[ii] ) != 0 ) - continue; - - if( thisRef.CompareLibName( componentFlatList[ii] ) != 0 ) - continue; + if( thisRef.CompareValue( componentFlatList[ii] ) != 0 ) continue; + if( thisRef.CompareLibName( componentFlatList[ii] ) != 0 ) continue; // Find the matching component for( unsigned jj = ii + 1; jj < componentFlatList.size(); jj++ ) { - if( ! thisRef.IsSameInstance( componentFlatList[jj] ) ) - continue; - + if( ! thisRef.IsSameInstance( componentFlatList[jj] ) ) continue; componentFlatList[jj].m_NumRef = componentFlatList[ii].m_NumRef; componentFlatList[jj].m_Unit = thisRef.m_Unit; componentFlatList[jj].m_IsNew = false; @@ -452,12 +438,13 @@ void SCH_REFERENCE_LIST::Annotate( bool aUseSheetNum, int aSheetIntervalId, } } } + else { /* search for others units of this component. - * we search for others parts that have the same value and the same - * reference prefix (ref without ref number) - */ + * we search for others parts that have the same value and the same + * reference prefix (ref without ref number) + */ for( Unit = 1; Unit <= NumberOfUnits; Unit++ ) { if( componentFlatList[ii].m_Unit == Unit ) @@ -511,7 +498,7 @@ int SCH_REFERENCE_LIST::CheckAnnotation( wxArrayString* aMessageList ) SortByRefAndValue(); - // Split reference designators into name (prefix) and number: IC1 becomes IC, and 1. + // Spiit reference designators into name (prefix) and number: IC1 becomes IC, and 1. SplitReferences(); // count not yet annotated items or annotation error. @@ -681,14 +668,14 @@ int SCH_REFERENCE_LIST::CheckAnnotation( wxArrayString* aMessageList ) for( int ii = 0; ( ii < imax ) && ( error < 4 ); ii++ ) { if( ( componentFlatList[ii].m_TimeStamp != componentFlatList[ii + 1].m_TimeStamp ) - || ( componentFlatList[ii].GetSheet() != componentFlatList[ii + 1].GetSheet() ) ) + || ( componentFlatList[ii].GetSheetPath() != componentFlatList[ii + 1].GetSheetPath() ) ) continue; // Same time stamp found. wxString full_path; full_path.Printf( wxT( "%s%8.8X" ), - GetChars( componentFlatList[ii].GetSheet()->GetPath() ), + GetChars( componentFlatList[ii].GetSheetPath().Path() ), componentFlatList[ii].m_TimeStamp ); msg.Printf( _( "Duplicate time stamp (%s) for %s%d and %s%d" ), @@ -707,25 +694,25 @@ int SCH_REFERENCE_LIST::CheckAnnotation( wxArrayString* aMessageList ) } -SCH_REFERENCE::SCH_REFERENCE( SCH_COMPONENT* aComponent, LIB_PART* aLibComponent, - SCH_SHEET* aSheet ) +SCH_REFERENCE::SCH_REFERENCE( SCH_COMPONENT* aComponent, LIB_PART* aLibComponent, + SCH_SHEET_PATH& aSheetPath ) { wxASSERT( aComponent != NULL && aLibComponent != NULL ); m_RootCmp = aComponent; m_Entry = aLibComponent; - m_Unit = aComponent->GetUnitSelection( aSheet ); - m_Sheet = aSheet; + m_Unit = aComponent->GetUnitSelection( &aSheetPath ); + m_SheetPath = aSheetPath; m_IsNew = false; m_Flag = 0; m_TimeStamp = aComponent->GetTimeStamp(); m_CmpPos = aComponent->GetPosition(); m_SheetNum = 0; - if( aComponent->GetRef( aSheet ).IsEmpty() ) - aComponent->SetRef( aSheet, wxT( "DefRef?" ) ); + if( aComponent->GetRef( &aSheetPath ).IsEmpty() ) + aComponent->SetRef( &aSheetPath, wxT( "DefRef?" ) ); - SetRef( aComponent->GetRef( aSheet ) ); + SetRef( aComponent->GetRef( &aSheetPath ) ); m_NumRef = -1; @@ -736,24 +723,6 @@ SCH_REFERENCE::SCH_REFERENCE( SCH_COMPONENT* aComponent, LIB_PART* aLibComponent } -int SCH_REFERENCE::CompareLibName( const SCH_REFERENCE& item ) const -{ - return Cmp_KEEPCASE( m_RootCmp->GetPartName(), item.m_RootCmp->GetPartName() ); -} - - -bool SCH_REFERENCE::IsSameInstance( const SCH_REFERENCE& other ) const -{ - return GetComp() == other.GetComp() && GetSheet()->GetPath() == other.GetSheet()->GetPath(); -} - - -bool SCH_REFERENCE::IsUnitsLocked() const -{ - return m_Entry->UnitsLocked(); -} - - void SCH_REFERENCE::Annotate() { if( m_NumRef < 0 ) @@ -761,9 +730,9 @@ void SCH_REFERENCE::Annotate() else m_Ref = TO_UTF8( GetRef() << m_NumRef ); - m_RootCmp->SetRef( m_Sheet, FROM_UTF8( m_Ref.c_str() ) ); + m_RootCmp->SetRef( &m_SheetPath, FROM_UTF8( m_Ref.c_str() ) ); m_RootCmp->SetUnit( m_Unit ); - m_RootCmp->SetUnitSelection( m_Sheet, m_Unit ); + m_RootCmp->SetUnitSelection( &m_SheetPath, m_Unit ); } @@ -797,7 +766,7 @@ void SCH_REFERENCE::Split() { while( ll >= 0 ) { - if( ( refText[ll] <= ' ' ) || isdigit( refText[ll] ) ) + if( (refText[ll] <= ' ' ) || isdigit( refText[ll] ) ) ll--; else { diff --git a/eeschema/controle.cpp b/eeschema/controle.cpp index 362b1fc66a..792f213999 100644 --- a/eeschema/controle.cpp +++ b/eeschema/controle.cpp @@ -108,7 +108,7 @@ SCH_ITEM* SCH_EDIT_FRAME::LocateAndShowItem( const wxPoint& aPosition, const KIC Pin->GetMsgPanelInfo( items ); if( LibItem ) - items.push_back( MSG_PANEL_ITEM( LibItem->GetRef( m_CurrentSheet->Last() ), + items.push_back( MSG_PANEL_ITEM( LibItem->GetRef( m_CurrentSheet ), LibItem->GetField( VALUE )->GetShownText(), DARKCYAN ) ); SetMsgPanel( items ); @@ -187,7 +187,7 @@ SCH_ITEM* SCH_EDIT_FRAME::LocateItem( const wxPoint& aPosition, const KICAD_T aF if( item ) { if( item->Type() == SCH_COMPONENT_T ) - ( (SCH_COMPONENT*) item )->SetCurrentSheet( GetCurrentSheet().Last() ); + ( (SCH_COMPONENT*) item )->SetCurrentSheetPath( &GetCurrentSheet() ); MSG_PANEL_ITEMS items; item->GetMsgPanelInfo( items ); diff --git a/eeschema/dialogs/dialog_edit_component_in_schematic.cpp b/eeschema/dialogs/dialog_edit_component_in_schematic.cpp index a1d8f76640..2e974e18d2 100644 --- a/eeschema/dialogs/dialog_edit_component_in_schematic.cpp +++ b/eeschema/dialogs/dialog_edit_component_in_schematic.cpp @@ -42,7 +42,6 @@ #include #include #include -#include #include #include @@ -340,7 +339,7 @@ void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::copyPanelToOptions() { int unit_selection = unitChoice->GetCurrentSelection() + 1; - m_cmp->SetUnitSelection( m_parent->GetCurrentSheet().Last(), unit_selection ); + m_cmp->SetUnitSelection( &m_parent->GetCurrentSheet(), unit_selection ); m_cmp->SetUnit( unit_selection ); } @@ -459,7 +458,7 @@ void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::OnOKButtonClick( wxCommandEvent& event // Reference has a specific initialization, depending on the current active sheet // because for a given component, in a complex hierarchy, there are more than one // reference. - m_cmp->SetRef( m_parent->GetCurrentSheet().Last(), m_FieldsBuf[REFERENCE].GetText() ); + m_cmp->SetRef( &m_parent->GetCurrentSheet(), m_FieldsBuf[REFERENCE].GetText() ); m_parent->OnModify(); m_parent->GetScreen()->TestDanglingEnds(); @@ -727,7 +726,7 @@ void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::InitBuffers( SCH_COMPONENT* aComponent } #endif - m_FieldsBuf[REFERENCE].SetText( m_cmp->GetRef( m_parent->GetCurrentSheet().Last() ) ); + m_FieldsBuf[REFERENCE].SetText( m_cmp->GetRef( &m_parent->GetCurrentSheet() ) ); for( unsigned i = 0; iLastScreen()->SetZoom( m_parent->GetScreen()->GetZoom() ); m_parent->SetCurrentSheet( *sheet ); - m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences(); + m_parent->GetCurrentSheet().UpdateAllScreenReferences(); } m_lastMarkerFound = marker; @@ -455,8 +455,8 @@ void DIALOG_ERC::TestErc( wxArrayString* aMessagesList ) m_tstUniqueGlobalLabels = m_cbTestUniqueGlbLabels->GetValue(); // Build the whole sheet list in hierarchy (sheet, not screen) - int refDes = 1; - g_RootSheet->AnnotatePowerSymbols( Prj().SchLibs(), &refDes ); + SCH_SHEET_LIST sheets; + sheets.AnnotatePowerSymbols( Prj().SchLibs() ); if( m_parent->CheckAnnotate( aMessagesList, false ) ) { diff --git a/eeschema/dialogs/dialog_print_using_printer.cpp b/eeschema/dialogs/dialog_print_using_printer.cpp index c21b5bb152..09257bda8c 100644 --- a/eeschema/dialogs/dialog_print_using_printer.cpp +++ b/eeschema/dialogs/dialog_print_using_printer.cpp @@ -327,7 +327,7 @@ bool SCH_PRINTOUT::OnPrintPage( int page ) if( list.BuildSheetPathInfoFromSheetPathValue( sheetpath->Path() ) ) { m_parent->SetCurrentSheet( list ); - m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences(); + m_parent->GetCurrentSheet().UpdateAllScreenReferences(); m_parent->SetSheetNumberAndCount(); screen = m_parent->GetCurrentSheet().LastScreen(); } @@ -341,7 +341,7 @@ bool SCH_PRINTOUT::OnPrintPage( int page ) DrawPage( screen ); m_parent->SetCurrentSheet( oldsheetpath ); - m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences(); + m_parent->GetCurrentSheet().UpdateAllScreenReferences(); m_parent->SetSheetNumberAndCount(); return true; diff --git a/eeschema/dialogs/dialog_rescue_each.cpp b/eeschema/dialogs/dialog_rescue_each.cpp index fcc7f489fa..ac804ba2ea 100644 --- a/eeschema/dialogs/dialog_rescue_each.cpp +++ b/eeschema/dialogs/dialog_rescue_each.cpp @@ -34,8 +34,6 @@ #include #include #include -#include - class DIALOG_RESCUE_EACH: public DIALOG_RESCUE_EACH_BASE { @@ -158,7 +156,7 @@ void DIALOG_RESCUE_EACH::PopulateInstanceList() SCH_FIELD* valueField = each_component->GetField( 1 ); data.clear(); - data.push_back( each_component->GetRef( m_Parent->GetCurrentSheet().Last() ) ); + data.push_back( each_component->GetRef( & m_Parent->GetCurrentSheet() ) ); data.push_back( valueField ? valueField->GetText() : wxT( "" ) ); m_ListOfInstances->AppendItem( data ); diff --git a/eeschema/edit_component_in_schematic.cpp b/eeschema/edit_component_in_schematic.cpp index 3a606a12dd..c9294a59cd 100644 --- a/eeschema/edit_component_in_schematic.cpp +++ b/eeschema/edit_component_in_schematic.cpp @@ -2,8 +2,8 @@ * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr - * Copyright (C) 2008-2015 Wayne Stambaugh - * Copyright (C) 2004-2015 KiCad Developers, see change_log.txt for contributors. + * Copyright (C) 2008-2013 Wayne Stambaugh + * Copyright (C) 2004-2013 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 @@ -38,7 +38,6 @@ #include #include #include -#include #include @@ -102,7 +101,7 @@ void SCH_EDIT_FRAME::EditComponentFieldText( SCH_FIELD* aField ) // Test if the reference string is valid: if( SCH_COMPONENT::IsReferenceStringValid( newtext ) ) { - component->SetRef( m_CurrentSheet->Last(), newtext ); + component->SetRef( m_CurrentSheet, newtext ); } else { @@ -146,7 +145,7 @@ void SCH_EDIT_FRAME::EditComponentFieldText( SCH_FIELD* aField ) } MSG_PANEL_ITEMS items; - component->SetCurrentSheet( GetCurrentSheet().Last() ); + component->SetCurrentSheetPath( &GetCurrentSheet() ); component->GetMsgPanelInfo( items ); SetMsgPanel( items ); } diff --git a/eeschema/erc.cpp b/eeschema/erc.cpp index d1e3207eed..f3ed69e78a 100644 --- a/eeschema/erc.cpp +++ b/eeschema/erc.cpp @@ -289,7 +289,7 @@ void Diagnose( NETLIST_OBJECT* aNetItemRef, NETLIST_OBJECT* aNetItemTst, cmp_ref = wxT( "?" ); if( aNetItemRef->m_Type == NET_PIN && aNetItemRef->m_Link ) - cmp_ref = aNetItemRef->GetComponentParent()->GetRef( aNetItemRef->m_SheetPath.Last() ); + cmp_ref = aNetItemRef->GetComponentParent()->GetRef( &aNetItemRef->m_SheetPath ); if( aNetItemTst == NULL ) { @@ -310,7 +310,7 @@ void Diagnose( NETLIST_OBJECT* aNetItemRef, NETLIST_OBJECT* aNetItemTst, { if( aNetItemRef->m_Type == NET_PIN && aNetItemRef->m_Link ) cmp_ref = aNetItemRef->GetComponentParent()->GetRef( - aNetItemRef->m_SheetPath.Last() ); + &aNetItemRef->m_SheetPath ); msg.Printf( _( "Pin %s (%s) of component %s is not driven (Net %d)." ), GetChars( string_pinnum ), @@ -352,7 +352,7 @@ void Diagnose( NETLIST_OBJECT* aNetItemRef, NETLIST_OBJECT* aNetItemTst, alt_cmp = wxT( "?" ); if( aNetItemTst->m_Type == NET_PIN && aNetItemTst->m_Link ) - alt_cmp = aNetItemTst->GetComponentParent()->GetRef( aNetItemTst->m_SheetPath.Last() ); + alt_cmp = aNetItemTst->GetComponentParent()->GetRef( &aNetItemTst->m_SheetPath ); msg.Printf( _( "Pin %s (%s) of component %s is connected to " ), GetChars( string_pinnum ), @@ -425,9 +425,9 @@ void TestOthersItems( NETLIST_OBJECT_LIST* aList, continue; if( ( (SCH_COMPONENT*) aList->GetItem( aNetItemRef )-> - m_Link )->GetRef( aList->GetItem( aNetItemRef )->m_SheetPath.Last() ) != + m_Link )->GetRef( &aList->GetItem( aNetItemRef )-> m_SheetPath ) != ( (SCH_COMPONENT*) aList->GetItem( duplicate )->m_Link ) - ->GetRef( aList->GetItem( duplicate )->m_SheetPath.Last() ) ) + ->GetRef( &aList->GetItem( duplicate )->m_SheetPath ) ) continue; // Same component and same pin. Do dot create error for this pin diff --git a/eeschema/files-io.cpp b/eeschema/files-io.cpp index ff0c5f3769..81b6d692b0 100644 --- a/eeschema/files-io.cpp +++ b/eeschema/files-io.cpp @@ -260,7 +260,7 @@ bool SCH_EDIT_FRAME::OpenProjectFiles( const std::vector& aFileSet, in GetScreen()->SetFileName( fullFileName ); g_RootSheet->SetFileName( fullFileName ); - g_RootSheet->SetName( "root" ); + SetStatusText( wxEmptyString ); ClearMsgPanel(); @@ -327,7 +327,7 @@ bool SCH_EDIT_FRAME::OpenProjectFiles( const std::vector& aFileSet, in GetScreen()->SetGrid( ID_POPUP_GRID_LEVEL_1000 + m_LastGridSizeId ); Zoom_Automatique( false ); SetSheetNumberAndCount(); - g_RootSheet->SetPageNumbers(); + m_canvas->Refresh( true ); return true; diff --git a/eeschema/find.cpp b/eeschema/find.cpp index 032dd87ad2..d3a29e7c81 100644 --- a/eeschema/find.cpp +++ b/eeschema/find.cpp @@ -71,8 +71,7 @@ void SCH_EDIT_FRAME::OnFindDrcMarker( wxFindDialogEvent& event ) if( event.GetFlags() & FR_CURRENT_SHEET_ONLY ) { sheetFoundIn = m_CurrentSheet; - lastMarker = (SCH_MARKER*) m_CurrentSheet->Last()->FindNextItem( SCH_MARKER_T, - lastMarker, wrap ); + lastMarker = (SCH_MARKER*) m_CurrentSheet->FindNextItem( SCH_MARKER_T, lastMarker, wrap ); } else { @@ -86,7 +85,7 @@ void SCH_EDIT_FRAME::OnFindDrcMarker( wxFindDialogEvent& event ) { sheetFoundIn->LastScreen()->SetZoom( GetScreen()->GetZoom() ); *m_CurrentSheet = *sheetFoundIn; - m_CurrentSheet->Last()->UpdateAllScreenReferences(); + m_CurrentSheet->UpdateAllScreenReferences(); } SetCrossHairPosition( lastMarker->GetPosition() ); @@ -140,7 +139,7 @@ SCH_ITEM* SCH_EDIT_FRAME::FindComponentAndItem( const wxString& aReference, SCH_COMPONENT* pSch = (SCH_COMPONENT*) item; - if( aReference.CmpNoCase( pSch->GetRef( sheet->Last() ) ) == 0 ) + if( aReference.CmpNoCase( pSch->GetRef( sheet ) ) == 0 ) { Component = pSch; sheetWithComponentFound = sheet; @@ -194,7 +193,7 @@ SCH_ITEM* SCH_EDIT_FRAME::FindComponentAndItem( const wxString& aReference, { sheet->LastScreen()->SetZoom( GetScreen()->GetZoom() ); *m_CurrentSheet = *sheet; - m_CurrentSheet->Last()->UpdateAllScreenReferences(); + m_CurrentSheet->UpdateAllScreenReferences(); centerAndRedraw = true; } @@ -490,7 +489,7 @@ void SCH_EDIT_FRAME::updateFindReplaceView( wxFindDialogEvent& aEvent ) { sheet->LastScreen()->SetZoom( GetScreen()->GetZoom() ); *m_CurrentSheet = *sheet; - m_CurrentSheet->Last()->UpdateAllScreenReferences(); + m_CurrentSheet->UpdateAllScreenReferences(); SetScreen( sheet->LastScreen() ); } diff --git a/eeschema/getpart.cpp b/eeschema/getpart.cpp index a6ca456207..302a998e11 100644 --- a/eeschema/getpart.cpp +++ b/eeschema/getpart.cpp @@ -41,7 +41,6 @@ #include #include #include -#include #include #include #include @@ -221,8 +220,8 @@ SCH_COMPONENT* SCH_EDIT_FRAME::Load_Component( wxDC* aDC, return NULL; } - SCH_COMPONENT* component = new SCH_COMPONENT( *part, m_CurrentSheet->Last(), unit, convert, - GetCrossHairPosition(), true ); + SCH_COMPONENT* component = new SCH_COMPONENT( *part, m_CurrentSheet, unit, convert, + GetCrossHairPosition(), true ); // Set the m_ChipName value, from component name in lib, for aliases // Note if part is found, and if name is an alias of a component, @@ -237,7 +236,7 @@ SCH_COMPONENT* SCH_EDIT_FRAME::Load_Component( wxDC* aDC, MSG_PANEL_ITEMS items; - component->SetCurrentSheet( GetCurrentSheet().Last() ); + component->SetCurrentSheetPath( &GetCurrentSheet() ); component->GetMsgPanelInfo( items ); SetMsgPanel( items ); @@ -326,7 +325,7 @@ void SCH_EDIT_FRAME::OnSelectUnit( wxCommandEvent& aEvent ) component->Draw( m_canvas, &dc, wxPoint( 0, 0 ), g_XorMode ); /* Update the unit number. */ - component->SetUnitSelection( m_CurrentSheet->Last(), unit ); + component->SetUnitSelection( m_CurrentSheet, unit ); component->SetUnit( unit ); component->ClearFlags(); component->SetFlags( flags ); // Restore m_Flag modified by SetUnit() diff --git a/eeschema/hierarch.cpp b/eeschema/hierarch.cpp index adbf2332c7..578274b173 100644 --- a/eeschema/hierarch.cpp +++ b/eeschema/hierarch.cpp @@ -285,7 +285,7 @@ void SCH_EDIT_FRAME::DisplayCurrentSheet() GetScreen()->SetGrid( m_LastGridSizeId + ID_POPUP_GRID_LEVEL_1000 ); // update the References - m_CurrentSheet->Last()->UpdateAllScreenReferences(); + m_CurrentSheet->UpdateAllScreenReferences(); SetSheetNumberAndCount(); m_canvas->SetCanStartBlock( -1 ); diff --git a/eeschema/menubar.cpp b/eeschema/menubar.cpp index 944220ea23..1900519954 100644 --- a/eeschema/menubar.cpp +++ b/eeschema/menubar.cpp @@ -100,8 +100,8 @@ void SCH_EDIT_FRAME::ReCreateMenuBar() } AddMenuItem( fileMenu, - ID_APPEND_PROJECT, _( "App&end Schematic Sheet" ), - _( "Append schematic sheet to current project" ), + ID_APPEND_PROJECT, _( "Imp&ort Schematic Sheet Content" ), + _( "Import a schematic sheet content from an other project in the current sheet" ), KiBitmap( open_document_xpm ) ); fileMenu->AppendSeparator(); diff --git a/eeschema/netlist.cpp b/eeschema/netlist.cpp index edcce6b089..ebc324570a 100644 --- a/eeschema/netlist.cpp +++ b/eeschema/netlist.cpp @@ -67,9 +67,9 @@ int TestDuplicateSheetNames( bool aCreateMarker ); bool SCH_EDIT_FRAME::prepareForNetlist() { - int refDes = 1; + SCH_SHEET_LIST sheets; - g_RootSheet->AnnotatePowerSymbols( Prj().SchLibs(), &refDes ); + sheets.AnnotatePowerSymbols( Prj().SchLibs() ); // Performs some controls: if( CheckAnnotate( NULL, 0 ) ) diff --git a/eeschema/netlist_exporters/netlist_exporter.cpp b/eeschema/netlist_exporters/netlist_exporter.cpp index 4a7ebf4a32..62e39ccca8 100644 --- a/eeschema/netlist_exporters/netlist_exporter.cpp +++ b/eeschema/netlist_exporters/netlist_exporter.cpp @@ -115,8 +115,7 @@ SCH_COMPONENT* NETLIST_EXPORTER::findNextComponent( EDA_ITEM* aItem, SCH_SHEET_P // Power symbols and other components which have the reference starting // with "#" are not included in netlist (pseudo or virtual components) - ref = comp->GetRef( aSheetPath->Last() ); - + ref = comp->GetRef( aSheetPath ); if( ref[0] == wxChar( '#' ) ) continue; @@ -174,7 +173,7 @@ SCH_COMPONENT* NETLIST_EXPORTER::findNextComponentAndCreatePinList( EDA_ITEM* // Power symbols and other components which have the reference starting // with "#" are not included in netlist (pseudo or virtual components) - ref = comp->GetRef( aSheetPath->Last() ); + ref = comp->GetRef( aSheetPath ); if( ref[0] == wxChar( '#' ) ) continue; @@ -207,7 +206,7 @@ SCH_COMPONENT* NETLIST_EXPORTER::findNextComponentAndCreatePinList( EDA_ITEM* { LIB_PINS pins; // constructed once here - part->GetPins( pins, comp->GetUnitSelection( aSheetPath->Last() ), comp->GetConvert() ); + part->GetPins( pins, comp->GetUnitSelection( aSheetPath ), comp->GetConvert() ); for( size_t i = 0; i < pins.size(); i++ ) { @@ -323,10 +322,10 @@ void NETLIST_EXPORTER::eraseDuplicatePins() void NETLIST_EXPORTER::findAllInstancesOfComponent( SCH_COMPONENT* aComponent, - LIB_PART* aEntry, - SCH_SHEET_PATH* aSheetPath ) + LIB_PART* aEntry, + SCH_SHEET_PATH* aSheetPath ) { - wxString ref = aComponent->GetRef( aSheetPath->Last() ); + wxString ref = aComponent->GetRef( aSheetPath ); wxString ref2; SCH_SHEET_LIST sheetList; @@ -340,11 +339,11 @@ void NETLIST_EXPORTER::findAllInstancesOfComponent( SCH_COMPONENT* aComponent, SCH_COMPONENT* comp2 = (SCH_COMPONENT*) item; - ref2 = comp2->GetRef( sheet->Last() ); + ref2 = comp2->GetRef( sheet ); if( ref2.CmpNoCase( ref ) != 0 ) continue; - int unit2 = comp2->GetUnitSelection( sheet->Last() ); // slow + int unit2 = comp2->GetUnitSelection( sheet ); // slow for( LIB_PIN* pin = aEntry->GetNextPin(); pin; pin = aEntry->GetNextPin( pin ) ) { diff --git a/eeschema/netlist_exporters/netlist_exporter_cadstar.cpp b/eeschema/netlist_exporters/netlist_exporter_cadstar.cpp index 9c94c7d394..2b5b7fbf45 100644 --- a/eeschema/netlist_exporters/netlist_exporter_cadstar.cpp +++ b/eeschema/netlist_exporters/netlist_exporter_cadstar.cpp @@ -93,7 +93,7 @@ bool NETLIST_EXPORTER_CADSTAR::WriteNetlist( const wxString& aOutFileName, unsig footprint = wxT( "$noname" ); */ - msg = component->GetRef( sheet->Last() ); + msg = component->GetRef( sheet ); ret |= fprintf( f, "%s ", TO_UTF8( StartCmpDesc ) ); ret |= fprintf( f, "%s", TO_UTF8( msg ) ); @@ -159,8 +159,7 @@ bool NETLIST_EXPORTER_CADSTAR::writeListOfNets( FILE* f ) continue; Cmp = nitem->GetComponentParent(); - wxString refstr = Cmp->GetRef( nitem->m_SheetPath.Last() ); - + wxString refstr = Cmp->GetRef( &nitem->m_SheetPath ); if( refstr[0] == '#' ) continue; // Power supply symbols. diff --git a/eeschema/netlist_exporters/netlist_exporter_generic.cpp b/eeschema/netlist_exporters/netlist_exporter_generic.cpp index df55edcef6..921e0fc1e4 100644 --- a/eeschema/netlist_exporters/netlist_exporter_generic.cpp +++ b/eeschema/netlist_exporters/netlist_exporter_generic.cpp @@ -131,7 +131,7 @@ XNODE* NETLIST_EXPORTER_GENERIC::makeComponents() // an element. xcomps->AddChild( xcomp = node( sComponent ) ); - xcomp->AddAttribute( sRef, comp->GetRef( path->Last() ) ); + xcomp->AddAttribute( sRef, comp->GetRef( path ) ); xcomp->AddChild( node( sValue, comp->GetField( VALUE )->GetText() ) ); @@ -467,8 +467,7 @@ XNODE* NETLIST_EXPORTER_GENERIC::makeListOfNets() comp = nitem->GetComponentParent(); // Get the reference for the net name and the main parent component - ref = comp->GetRef( nitem->m_SheetPath.Last() ); - + ref = comp->GetRef( &nitem->m_SheetPath ); if( ref[0] == wxChar( '#' ) ) continue; @@ -530,8 +529,7 @@ bool NETLIST_EXPORTER_GENERIC::writeListOfNets( FILE* f, NETLIST_OBJECT_LIST& aO comp = nitem->GetComponentParent(); // Get the reference for the net name and the main parent component - ref = comp->GetRef( nitem->m_SheetPath.Last() ); - + ref = comp->GetRef( &nitem->m_SheetPath ); if( ref[0] == wxChar( '#' ) ) continue; // Pseudo component (Like Power symbol) diff --git a/eeschema/netlist_exporters/netlist_exporter_orcadpcb2.cpp b/eeschema/netlist_exporters/netlist_exporter_orcadpcb2.cpp index 55d807cf8e..0aeaccc3d0 100644 --- a/eeschema/netlist_exporters/netlist_exporter_orcadpcb2.cpp +++ b/eeschema/netlist_exporters/netlist_exporter_orcadpcb2.cpp @@ -87,7 +87,7 @@ bool NETLIST_EXPORTER_ORCADPCB2::WriteNetlist( const wxString& aOutFileName, uns { if( part->GetFootPrints().GetCount() != 0 ) // Put in list { - cmpList.push_back( SCH_REFERENCE( comp, part, path->Last() ) ); + cmpList.push_back( SCH_REFERENCE( comp, part, *path ) ); } } @@ -99,10 +99,10 @@ bool NETLIST_EXPORTER_ORCADPCB2::WriteNetlist( const wxString& aOutFileName, uns else footprint = wxT( "$noname" ); - field = comp->GetRef( path->Last() ); + field = comp->GetRef( path ); ret |= fprintf( f, " ( %s %s", - TO_UTF8( comp->GetPath( path->Last() ) ), + TO_UTF8( comp->GetPath( path ) ), TO_UTF8( footprint ) ); ret |= fprintf( f, " %s", TO_UTF8( field ) ); diff --git a/eeschema/netlist_exporters/netlist_exporter_pspice.cpp b/eeschema/netlist_exporters/netlist_exporter_pspice.cpp index 90746556b0..7158bd4d5e 100644 --- a/eeschema/netlist_exporters/netlist_exporter_pspice.cpp +++ b/eeschema/netlist_exporters/netlist_exporter_pspice.cpp @@ -235,7 +235,7 @@ bool NETLIST_EXPORTER_PSPICE::WriteNetlist( const wxString& aOutFileName, unsign } //Get Standard Reference Designator: - wxString RefName = comp->GetRef( sheet->Last() ); + wxString RefName = comp->GetRef( sheet ); //Conditionally add Prefix only for devices that begin with U or IC: if( aUsePrefix ) diff --git a/eeschema/onleftclick.cpp b/eeschema/onleftclick.cpp index c4cf77bb60..35ba87d496 100644 --- a/eeschema/onleftclick.cpp +++ b/eeschema/onleftclick.cpp @@ -98,11 +98,6 @@ void SCH_EDIT_FRAME::OnLeftClick( wxDC* aDC, const wxPoint& aPosition ) else { item = LocateAndShowItem( aPosition ); - - // Show the sheet information when the user clicks anywhere there are no items - // in the schematic. - if( item == NULL ) - SetMsgPanel( GetCurrentSheet().Last() ); } } diff --git a/eeschema/plot_schematic_DXF.cpp b/eeschema/plot_schematic_DXF.cpp index 887aa36886..a571c73baa 100644 --- a/eeschema/plot_schematic_DXF.cpp +++ b/eeschema/plot_schematic_DXF.cpp @@ -30,7 +30,6 @@ #include #include #include -#include #include #include @@ -68,7 +67,7 @@ void DIALOG_PLOT_SCHEMATIC::CreateDXFFile( bool aPlotAll, bool aPlotFrameRef ) if( list.BuildSheetPathInfoFromSheetPathValue( sheetpath->Path() ) ) { schframe->SetCurrentSheet( list ); - schframe->GetCurrentSheet().Last()->UpdateAllScreenReferences(); + schframe->GetCurrentSheet().UpdateAllScreenReferences(); schframe->SetSheetNumberAndCount(); screen = schframe->GetCurrentSheet().LastScreen(); } @@ -106,7 +105,7 @@ void DIALOG_PLOT_SCHEMATIC::CreateDXFFile( bool aPlotAll, bool aPlotFrameRef ) msg.Printf( wxT( "DXF Plotter exception: %s"), GetChars( e.errorText ) ); reporter.Report( msg, REPORTER::RPT_ERROR ); schframe->SetCurrentSheet( oldsheetpath ); - schframe->GetCurrentSheet().Last()->UpdateAllScreenReferences(); + schframe->GetCurrentSheet().UpdateAllScreenReferences(); schframe->SetSheetNumberAndCount(); return; } @@ -117,7 +116,7 @@ void DIALOG_PLOT_SCHEMATIC::CreateDXFFile( bool aPlotAll, bool aPlotFrameRef ) } schframe->SetCurrentSheet( oldsheetpath ); - schframe->GetCurrentSheet().Last()->UpdateAllScreenReferences(); + schframe->GetCurrentSheet().UpdateAllScreenReferences(); schframe->SetSheetNumberAndCount(); } @@ -126,7 +125,7 @@ bool DIALOG_PLOT_SCHEMATIC::PlotOneSheetDXF( const wxString& aFileName, SCH_SCREEN* aScreen, wxPoint aPlotOffset, double aScale, - bool aPlotFrameRef ) + bool aPlotFrameRef ) { DXF_PLOTTER* plotter = new DXF_PLOTTER(); diff --git a/eeschema/plot_schematic_HPGL.cpp b/eeschema/plot_schematic_HPGL.cpp index a19cd16341..c4479404f9 100644 --- a/eeschema/plot_schematic_HPGL.cpp +++ b/eeschema/plot_schematic_HPGL.cpp @@ -30,7 +30,6 @@ #include #include #include -#include #include #include @@ -141,7 +140,7 @@ void DIALOG_PLOT_SCHEMATIC::createHPGLFile( bool aPlotAll, bool aPlotFrameRef ) if( list.BuildSheetPathInfoFromSheetPathValue( sheetpath->Path() ) ) { m_parent->SetCurrentSheet( list ); - m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences(); + m_parent->GetCurrentSheet().UpdateAllScreenReferences(); m_parent->SetSheetNumberAndCount(); screen = m_parent->GetCurrentSheet().LastScreen(); @@ -209,7 +208,7 @@ void DIALOG_PLOT_SCHEMATIC::createHPGLFile( bool aPlotAll, bool aPlotFrameRef ) } m_parent->SetCurrentSheet( oldsheetpath ); - m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences(); + m_parent->GetCurrentSheet().UpdateAllScreenReferences(); m_parent->SetSheetNumberAndCount(); } diff --git a/eeschema/plot_schematic_PDF.cpp b/eeschema/plot_schematic_PDF.cpp index a72c7d3355..900e1fb625 100644 --- a/eeschema/plot_schematic_PDF.cpp +++ b/eeschema/plot_schematic_PDF.cpp @@ -28,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -78,7 +77,7 @@ void DIALOG_PLOT_SCHEMATIC::createPDFFile( bool aPlotAll, bool aPlotFrameRef ) if( list.BuildSheetPathInfoFromSheetPathValue( sheetpath->Path() ) ) { m_parent->SetCurrentSheet( list ); - m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences(); + m_parent->GetCurrentSheet().UpdateAllScreenReferences(); m_parent->SetSheetNumberAndCount(); screen = m_parent->GetCurrentSheet().LastScreen(); } @@ -155,7 +154,7 @@ void DIALOG_PLOT_SCHEMATIC::restoreEnvironment( PDF_PLOTTER* aPlotter, // Restore the previous sheet m_parent->SetCurrentSheet( aOldsheetpath ); - m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences(); + m_parent->GetCurrentSheet().UpdateAllScreenReferences(); m_parent->SetSheetNumberAndCount(); } diff --git a/eeschema/plot_schematic_PS.cpp b/eeschema/plot_schematic_PS.cpp index fc1dac9d5e..0c42e53b91 100644 --- a/eeschema/plot_schematic_PS.cpp +++ b/eeschema/plot_schematic_PS.cpp @@ -29,7 +29,6 @@ #include #include #include -#include #include #include #include @@ -68,7 +67,7 @@ void DIALOG_PLOT_SCHEMATIC::createPSFile( bool aPlotAll, bool aPlotFrameRef ) if( list.BuildSheetPathInfoFromSheetPathValue( sheetpath->Path() ) ) { m_parent->SetCurrentSheet( list ); - m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences(); + m_parent->GetCurrentSheet().UpdateAllScreenReferences(); m_parent->SetSheetNumberAndCount(); screen = m_parent->GetCurrentSheet().LastScreen(); } @@ -142,7 +141,7 @@ void DIALOG_PLOT_SCHEMATIC::createPSFile( bool aPlotAll, bool aPlotFrameRef ) } m_parent->SetCurrentSheet( oldsheetpath ); - m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences(); + m_parent->GetCurrentSheet().UpdateAllScreenReferences(); m_parent->SetSheetNumberAndCount(); } diff --git a/eeschema/plot_schematic_SVG.cpp b/eeschema/plot_schematic_SVG.cpp index 6213d34e09..0cc81ed854 100644 --- a/eeschema/plot_schematic_SVG.cpp +++ b/eeschema/plot_schematic_SVG.cpp @@ -34,7 +34,6 @@ #include #include #include -#include #include #include #include @@ -68,7 +67,7 @@ void DIALOG_PLOT_SCHEMATIC::createSVGFile( bool aPrintAll, bool aPrintFrameRef ) if( list.BuildSheetPathInfoFromSheetPathValue( sheetpath->Path() ) ) { m_parent->SetCurrentSheet( list ); - m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences(); + m_parent->GetCurrentSheet().UpdateAllScreenReferences(); m_parent->SetSheetNumberAndCount(); screen = m_parent->GetCurrentSheet().LastScreen(); } @@ -110,14 +109,14 @@ void DIALOG_PLOT_SCHEMATIC::createSVGFile( bool aPrintAll, bool aPrintFrameRef ) reporter.Report( msg, REPORTER::RPT_ERROR ); m_parent->SetCurrentSheet( oldsheetpath ); - m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences(); + m_parent->GetCurrentSheet().UpdateAllScreenReferences(); m_parent->SetSheetNumberAndCount(); return; } } m_parent->SetCurrentSheet( oldsheetpath ); - m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences(); + m_parent->GetCurrentSheet().UpdateAllScreenReferences(); m_parent->SetSheetNumberAndCount(); } else // Print current sheet diff --git a/eeschema/sch_component.cpp b/eeschema/sch_component.cpp index b62a09f293..aaed3f31a3 100644 --- a/eeschema/sch_component.cpp +++ b/eeschema/sch_component.cpp @@ -118,22 +118,22 @@ SCH_COMPONENT::SCH_COMPONENT( const wxPoint& aPos, SCH_ITEM* aParent ) : SCH_ITEM( aParent, SCH_COMPONENT_T ) { Init( aPos ); - m_currentSheet = NULL; + m_currentSheetPath = NULL; m_fieldsAutoplaced = AUTOPLACED_NO; } -SCH_COMPONENT::SCH_COMPONENT( LIB_PART& aPart, SCH_SHEET* aSheet, int unit, +SCH_COMPONENT::SCH_COMPONENT( LIB_PART& aPart, SCH_SHEET_PATH* sheet, int unit, int convert, const wxPoint& pos, bool setNewItemFlag ) : SCH_ITEM( NULL, SCH_COMPONENT_T ) { Init( pos ); - m_unit = unit; - m_convert = convert; - m_part_name = aPart.GetName(); - m_part = aPart.SharedPtr(); - m_currentSheet = aSheet; + m_unit = unit; + m_convert = convert; + m_part_name = aPart.GetName(); + m_part = aPart.SharedPtr(); + m_currentSheetPath = NULL; m_fieldsAutoplaced = AUTOPLACED_NO; SetTimeStamp( GetNewTimeStamp() ); @@ -186,7 +186,7 @@ SCH_COMPONENT::SCH_COMPONENT( LIB_PART& aPart, SCH_SHEET* aSheet, int unit, // update the reference -- just the prefix for now. msg += wxT( "?" ); - SetRef( aSheet, msg ); + SetRef( sheet, msg ); // Use the schematic component name instead of the library value field // name. @@ -197,13 +197,13 @@ SCH_COMPONENT::SCH_COMPONENT( LIB_PART& aPart, SCH_SHEET* aSheet, int unit, SCH_COMPONENT::SCH_COMPONENT( const SCH_COMPONENT& aComponent ) : SCH_ITEM( aComponent ) { - m_currentSheet = NULL; - m_Parent = aComponent.m_Parent; - m_Pos = aComponent.m_Pos; - m_unit = aComponent.m_unit; - m_convert = aComponent.m_convert; - m_part_name = aComponent.m_part_name; - m_part = aComponent.m_part; + m_currentSheetPath = NULL; + m_Parent = aComponent.m_Parent; + m_Pos = aComponent.m_Pos; + m_unit = aComponent.m_unit; + m_convert = aComponent.m_convert; + m_part_name = aComponent.m_part_name; + m_part = aComponent.m_part; SetTimeStamp( aComponent.m_TimeStamp ); @@ -432,21 +432,21 @@ void SCH_COMPONENT::AddHierarchicalReference( const wxString& aPath, } -wxString SCH_COMPONENT::GetPath( const SCH_SHEET* aSheet ) const +wxString SCH_COMPONENT::GetPath( const SCH_SHEET_PATH* sheet ) const { - wxCHECK_MSG( aSheet != NULL, wxEmptyString, + wxCHECK_MSG( sheet != NULL, wxEmptyString, wxT( "Cannot get component path with invalid sheet object." ) ); wxString str; str.Printf( wxT( "%8.8lX" ), (long unsigned) m_TimeStamp ); - return aSheet->GetPath() + str; + return sheet->Path() + str; } -const wxString SCH_COMPONENT::GetRef( const SCH_SHEET* aSheet ) +const wxString SCH_COMPONENT::GetRef( const SCH_SHEET_PATH* sheet ) { - wxString path = GetPath( aSheet ); + wxString path = GetPath( sheet ); wxString h_path, h_ref; wxStringTokenizer tokenizer; wxString separators( wxT( " " ) ); @@ -473,7 +473,7 @@ const wxString SCH_COMPONENT::GetRef( const SCH_SHEET* aSheet ) // all have the same component references, but perhaps this is best. if( !GetField( REFERENCE )->GetText().IsEmpty() ) { - SetRef( aSheet, GetField( REFERENCE )->GetText() ); + SetRef( sheet, GetField( REFERENCE )->GetText() ); return GetField( REFERENCE )->GetText(); } @@ -481,6 +481,12 @@ const wxString SCH_COMPONENT::GetRef( const SCH_SHEET* aSheet ) } +/* Function IsReferenceStringValid (static function) + * Tests for an acceptable reference string + * An acceptable reference string must support unannotation + * i.e starts by letter + * returns true if OK + */ bool SCH_COMPONENT::IsReferenceStringValid( const wxString& aReferenceString ) { wxString text = aReferenceString; @@ -500,9 +506,9 @@ bool SCH_COMPONENT::IsReferenceStringValid( const wxString& aReferenceString ) } -void SCH_COMPONENT::SetRef( const SCH_SHEET* aSheet, const wxString& ref ) +void SCH_COMPONENT::SetRef( const SCH_SHEET_PATH* sheet, const wxString& ref ) { - wxString path = GetPath( aSheet ); + wxString path = GetPath( sheet ); bool notInArray = true; @@ -578,7 +584,7 @@ void SCH_COMPONENT::SetTimeStamp( time_t aNewTimeStamp ) } -int SCH_COMPONENT::GetUnitSelection( SCH_SHEET* aSheet ) +int SCH_COMPONENT::GetUnitSelection( SCH_SHEET_PATH* aSheet ) { wxString path = GetPath( aSheet ); wxString h_path, h_multi; @@ -606,7 +612,7 @@ int SCH_COMPONENT::GetUnitSelection( SCH_SHEET* aSheet ) } -void SCH_COMPONENT::SetUnitSelection( SCH_SHEET* aSheet, int aUnitSelection ) +void SCH_COMPONENT::SetUnitSelection( SCH_SHEET_PATH* aSheet, int aUnitSelection ) { wxString path = GetPath( aSheet ); @@ -745,7 +751,7 @@ void SCH_COMPONENT::SwapData( SCH_ITEM* aItem ) } -void SCH_COMPONENT::ClearAnnotation( SCH_SHEET* aSheet ) +void SCH_COMPONENT::ClearAnnotation( SCH_SHEET_PATH* aSheetPath ) { bool keepMulti = false; wxArrayString reference_fields; @@ -768,7 +774,7 @@ void SCH_COMPONENT::ClearAnnotation( SCH_SHEET* aSheet ) } else { // This is a malformed reference: reinit this reference - m_prefix = defRef = wxT( "U" ); // Set to default ref prefix + m_prefix = defRef = wxT("U"); // Set to default ref prefix } defRef.Append( wxT( "?" ) ); @@ -777,22 +783,22 @@ void SCH_COMPONENT::ClearAnnotation( SCH_SHEET* aSheet ) // For components with units locked, // we cannot remove all annotations: part selection must be kept - // For all components: if aSheet is not NULL, + // For all components: if aSheetPath is not NULL, // remove annotation only for the given path - if( keepMulti || aSheet ) + if( keepMulti || aSheetPath ) { wxString NewHref; wxString path; - if( aSheet ) - path = GetPath( aSheet ); + if( aSheetPath ) + path = GetPath( aSheetPath ); for( unsigned int ii = 0; ii < m_PathsAndReferences.GetCount(); ii++ ) { // Break hierarchical reference in path, ref and multi selection: reference_fields = wxStringTokenize( m_PathsAndReferences[ii], separators ); - if( aSheet == NULL || reference_fields[0].Cmp( path ) == 0 ) + if( aSheetPath == NULL || reference_fields[0].Cmp( path ) == 0 ) { if( keepMulti ) // Get and keep part selection multi = reference_fields[2]; @@ -1528,8 +1534,9 @@ void SCH_COMPONENT::GetMsgPanelInfo( MSG_PANEL_ITEMS& aList ) if( !alias ) return; - if( m_currentSheet ) - aList.push_back( MSG_PANEL_ITEM( _( "Reference" ), GetRef( m_currentSheet ), + if( m_currentSheetPath ) + aList.push_back( MSG_PANEL_ITEM( _( "Reference" ), + GetRef( m_currentSheetPath ), DARKCYAN ) ); wxString msg = part->IsPower() ? _( "Power symbol" ) : _( "Value" ); @@ -1879,7 +1886,7 @@ void SCH_COMPONENT::GetNetListItem( NETLIST_OBJECT_LIST& aNetListItems, { wxASSERT( pin->Type() == LIB_PIN_T ); - if( pin->GetUnit() && ( pin->GetUnit() != GetUnitSelection( aSheetPath->Last() ) ) ) + if( pin->GetUnit() && ( pin->GetUnit() != GetUnitSelection( aSheetPath ) ) ) continue; if( pin->GetConvert() && ( pin->GetConvert() != GetConvert() ) ) diff --git a/eeschema/sch_component.h b/eeschema/sch_component.h index 9f917f3fef..7d64546615 100644 --- a/eeschema/sch_component.h +++ b/eeschema/sch_component.h @@ -89,12 +89,12 @@ private: AUTOPLACED m_fieldsAutoplaced; ///< indicates status of field autoplacement /** - * A temporary sheet is required to generate the correct reference designator string + * A temporary sheet path is required to generate the correct reference designator string * in complex heirarchies. Hopefully this is only a temporary hack to decouple schematic * objects from the drawing window until a better design for handling complex heirarchies * can be implemented. */ - const SCH_SHEET* m_currentSheet; + const SCH_SHEET_PATH* m_currentSheetPath; /** * Defines the hierarchical path and reference of the component. This allows support @@ -121,7 +121,7 @@ public: * @param pos - Position to place new component. * @param setNewItemFlag - Set the component IS_NEW and IS_MOVED flags. */ - SCH_COMPONENT( LIB_PART& aPart, SCH_SHEET* aSheet, + SCH_COMPONENT( LIB_PART& aPart, SCH_SHEET_PATH* aSheet, int unit = 0, int convert = 0, const wxPoint& pos = wxPoint( 0, 0 ), bool setNewItemFlag = false ); @@ -244,10 +244,10 @@ public: /** * Function ClearAnnotation * clears exiting component annotation ( i.i IC23 changed to IC? and part reset to 1) - * @param aSheet: SCH_SHEET value: if NULL remove all annotations, - * else remove annotation relative to \a aSheet. + * @param aSheetPath: SCH_SHEET_PATH value: if NULL remove all annotations, + * else remove annotation relative to this sheetpath */ - void ClearAnnotation( SCH_SHEET* aSheet ); + void ClearAnnotation( SCH_SHEET_PATH* aSheetPath ); /** * Function SetTimeStamp @@ -391,8 +391,8 @@ public: void SwapData( SCH_ITEM* aItem ); - // returns a unique ID, in the form of a path determined by \a aSheet. - wxString GetPath( const SCH_SHEET* sheet ) const; + // returns a unique ID, in the form of a path. + wxString GetPath( const SCH_SHEET_PATH* sheet ) const; /** * Function IsReferenceStringValid (static) @@ -404,21 +404,21 @@ public: */ static bool IsReferenceStringValid( const wxString& aReferenceString ); - void SetCurrentSheet( const SCH_SHEET* aSheet ) + void SetCurrentSheetPath( const SCH_SHEET_PATH* aSheetPath ) { - m_currentSheet = aSheet; + m_currentSheetPath = aSheetPath; } /** * Function GetRef * returns the reference, for the given sheet path. */ - const wxString GetRef( const SCH_SHEET* sheet ); + const wxString GetRef( const SCH_SHEET_PATH* sheet ); /** * Set the reference, for the given sheet path. */ - void SetRef( const SCH_SHEET* aSheet, const wxString& ref ); + void SetRef( const SCH_SHEET_PATH* sheet, const wxString& ref ); /** * Function AddHierarchicalReference @@ -432,11 +432,11 @@ public: const wxString& aRef, int aMulti ); - // returns the unit selection, for the given sheet. - int GetUnitSelection( SCH_SHEET* aSheet ); + // returns the unit selection, for the given sheet path. + int GetUnitSelection( SCH_SHEET_PATH* aSheet ); - // Set the unit selection, for the given sheet. - void SetUnitSelection( SCH_SHEET* aSheet, int aUnitSelection ); + // Set the unit selection, for the given sheet path. + void SetUnitSelection( SCH_SHEET_PATH* aSheet, int aUnitSelection ); // Geometric transforms (used in block operations): diff --git a/eeschema/sch_field.cpp b/eeschema/sch_field.cpp index 63f5bbd6e6..38cbe18277 100644 --- a/eeschema/sch_field.cpp +++ b/eeschema/sch_field.cpp @@ -48,7 +48,6 @@ #include #include #include -#include #include @@ -402,7 +401,7 @@ bool SCH_FIELD::Matches( wxFindReplaceData& aSearchData, void* aAuxData, wxPoint wxCHECK_MSG( component != NULL, false, wxT( "No component associated with field" ) + text ); - text = component->GetRef( ((SCH_SHEET_PATH*) aAuxData)->Last() ); + text = component->GetRef( (SCH_SHEET_PATH*) aAuxData ); if( component->GetUnitCount() > 1 ) text << LIB_PART::SubReference( component->GetUnit() ); @@ -440,7 +439,7 @@ bool SCH_FIELD::Replace( wxFindReplaceData& aSearchData, void* aAuxData ) wxCHECK_MSG( component != NULL, false, wxT( "No component associated with field" ) + text ); - text = component->GetRef( ((SCH_SHEET_PATH*) aAuxData)->Last() ); + text = component->GetRef( (SCH_SHEET_PATH*) aAuxData ); // if( component->GetUnitCount() > 1 ) // text << LIB_PART::SubReference( component->GetUnit() ); @@ -448,7 +447,7 @@ bool SCH_FIELD::Replace( wxFindReplaceData& aSearchData, void* aAuxData ) isReplaced = EDA_ITEM::Replace( aSearchData, text ); if( isReplaced ) - component->SetRef( ((SCH_SHEET_PATH*) aAuxData)->Last(), text ); + component->SetRef( (SCH_SHEET_PATH*) aAuxData, text ); } else { diff --git a/eeschema/sch_reference_list.h b/eeschema/sch_reference_list.h index 9c2e410a0a..d5048cbf71 100644 --- a/eeschema/sch_reference_list.h +++ b/eeschema/sch_reference_list.h @@ -2,7 +2,7 @@ * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 1992-2011 jean-pierre Charras - * Copyright (C) 1992-2015 Wayne Stambaugh + * Copyright (C) 1992-2011 Wayne Stambaugh * Copyright (C) 1992-2015 KiCad Developers, see authors.txt for contributors. * * This program is free software; you can redistribute it and/or @@ -35,16 +35,15 @@ #include #include +#include +#include #include #include - -class SCH_SHEET; -class SCH_COMPONENT; +class SCH_REFERENCE; class SCH_REFERENCE_LIST; - /** * Class SCH_REFERENCE * is used as a helper to define a component's reference designator in a schematic. This @@ -63,11 +62,11 @@ class SCH_REFERENCE ///< used to annotate by X or Y position int m_Unit; ///< The unit number for components with multiple parts ///< per package. - SCH_SHEET* m_Sheet; ///< The sheet for this reference. + SCH_SHEET_PATH m_SheetPath; ///< The sheet path for this reference. bool m_IsNew; ///< True if not yet annotated. int m_SheetNum; ///< The sheet number for the reference. time_t m_TimeStamp; ///< The time stamp for the reference. - EDA_TEXT* m_Value; ///< The component value of the reference. It is the + EDA_TEXT* m_Value; ///< The component value of the refernce. It is the ///< same for all instances. int m_NumRef; ///< The numeric part of the reference designator. int m_Flag; @@ -78,7 +77,7 @@ class SCH_REFERENCE public: SCH_REFERENCE() : - m_Sheet() + m_SheetPath() { m_RootCmp = NULL; m_Entry = NULL; @@ -91,13 +90,14 @@ public: m_SheetNum = 0; } - SCH_REFERENCE( SCH_COMPONENT* aComponent, LIB_PART* aLibComponent, SCH_SHEET* aSheet ); + SCH_REFERENCE( SCH_COMPONENT* aComponent, LIB_PART* aLibComponent, + SCH_SHEET_PATH& aSheetPath ); SCH_COMPONENT* GetComp() const { return m_RootCmp; } LIB_PART* GetLibComponent() const { return m_Entry; } - SCH_SHEET* GetSheet() const { return m_Sheet; } + SCH_SHEET_PATH GetSheetPath() const { return m_SheetPath; } int GetUnit() const { return m_Unit; } @@ -131,12 +131,10 @@ public: { return m_Ref; } - void SetRefStr( const std::string& aReference ) { m_Ref = aReference; } - const char* GetRefStr() const { return m_Ref.c_str(); @@ -152,16 +150,25 @@ public: return m_Ref.compare( item.m_Ref ); } - int CompareLibName( const SCH_REFERENCE& item ) const; + int CompareLibName( const SCH_REFERENCE& item ) const + { + return Cmp_KEEPCASE( m_RootCmp->GetPartName(), item.m_RootCmp->GetPartName() ); + } /** * Function IsSameInstance * returns whether this reference refers to the same component instance * (component and sheet) as another. */ - bool IsSameInstance( const SCH_REFERENCE& other ) const; + bool IsSameInstance( const SCH_REFERENCE& other ) const + { + return GetComp() == other.GetComp() && GetSheetPath().Path() == other.GetSheetPath().Path(); + } - bool IsUnitsLocked() const; + bool IsUnitsLocked() + { + return m_Entry->UnitsLocked(); + } }; @@ -289,8 +296,7 @@ public: * referenced U201 to U351, and items in sheet 3 start from U352 *

*/ - void Annotate( bool aUseSheetNum, int aSheetIntervalId, - std::map& aLockedUnitMap ); + void Annotate( bool aUseSheetNum, int aSheetIntervalId, SCH_MULTI_UNIT_REFERENCE_MAP aLockedUnitMap ); /** * Function CheckAnnotation @@ -460,12 +466,4 @@ private: int CreateFirstFreeRefId( std::vector& aIdList, int aFirstValue ); }; - -/** - * Type SCH_MULTI_UNIT_REFERENCE_MAP - * is used to create a map of reference designators for multi-unit parts. - */ -typedef std::map SCH_MULTI_UNIT_REFERENCE_MAP; - - #endif // _SCH_REFERENCE_LIST_H_ diff --git a/eeschema/sch_screen.cpp b/eeschema/sch_screen.cpp index 8ea1d3f5d8..c2f8201979 100644 --- a/eeschema/sch_screen.cpp +++ b/eeschema/sch_screen.cpp @@ -755,7 +755,7 @@ int SCH_SCREEN::CountConnectedItems( const wxPoint& aPos, bool aTestJunctions ) } -void SCH_SCREEN::ClearAnnotation( SCH_SHEET* aSheet ) +void SCH_SCREEN::ClearAnnotation( SCH_SHEET_PATH* aSheetPath ) { for( SCH_ITEM* item = m_drawList.begin(); item; item = item->Next() ) { @@ -763,7 +763,7 @@ void SCH_SCREEN::ClearAnnotation( SCH_SHEET* aSheet ) { SCH_COMPONENT* component = (SCH_COMPONENT*) item; - component->ClearAnnotation( aSheet ); + component->ClearAnnotation( aSheetPath ); // Clear the modified component flag set by component->ClearAnnotation // because we do not use it here and we should not leave this flag set, @@ -1103,7 +1103,7 @@ SCH_TEXT* SCH_SCREEN::GetLabel( const wxPoint& aPosition, int aAccuracy ) } -bool SCH_SCREEN::SetComponentFootprint( SCH_SHEET* aSheet, const wxString& aReference, +bool SCH_SCREEN::SetComponentFootprint( SCH_SHEET_PATH* aSheetPath, const wxString& aReference, const wxString& aFootPrint, bool aSetVisible ) { SCH_COMPONENT* component; @@ -1116,7 +1116,7 @@ bool SCH_SCREEN::SetComponentFootprint( SCH_SHEET* aSheet, const wxString& aRefe component = (SCH_COMPONENT*) item; - if( aReference.CmpNoCase( component->GetRef( aSheet ) ) == 0 ) + if( aReference.CmpNoCase( component->GetRef( aSheetPath ) ) == 0 ) { // Found: Init Footprint Field @@ -1125,7 +1125,6 @@ bool SCH_SCREEN::SetComponentFootprint( SCH_SHEET* aSheet, const wxString& aRefe * it is probably not yet initialized */ SCH_FIELD * fpfield = component->GetField( FOOTPRINT ); - if( fpfield->GetText().IsEmpty() && ( fpfield->GetTextPosition() == component->GetPosition() ) ) { @@ -1432,6 +1431,13 @@ void SCH_SCREENS::BuildScreenList( EDA_ITEM* aItem ) } +void SCH_SCREENS::ClearAnnotation() +{ + for( size_t i = 0; i < m_screens.size(); i++ ) + m_screens[i]->ClearAnnotation( NULL ); +} + + void SCH_SCREENS::SchematicCleanUp() { for( size_t i = 0; i < m_screens.size(); i++ ) diff --git a/eeschema/sch_sheet.cpp b/eeschema/sch_sheet.cpp index 4d149a1e6d..e1ec949a54 100644 --- a/eeschema/sch_sheet.cpp +++ b/eeschema/sch_sheet.cpp @@ -2,7 +2,7 @@ * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2009 Jean-Pierre Charras, jp.charras at wanadoo.fr - * Copyright (C) 1992-2015 KiCad Developers, see AUTHORS.txt for contributors. + * Copyright (C) 1992-2011 Kicad Developers, see AUTHORS.txt for contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -37,7 +37,6 @@ #include #include -#include #include #include #include @@ -56,7 +55,6 @@ SCH_SHEET::SCH_SHEET( const wxPoint& pos ) : m_screen = NULL; m_name.Printf( wxT( "Sheet%8.8lX" ), (long) m_TimeStamp ); m_fileName.Printf( wxT( "file%8.8lX.sch" ), (long) m_TimeStamp ); - m_number = 1; } @@ -73,7 +71,6 @@ SCH_SHEET::SCH_SHEET( const SCH_SHEET& aSheet ) : m_name = aSheet.m_name; m_fileName = aSheet.m_fileName; m_pins = aSheet.m_pins; - m_number = aSheet.m_number; for( size_t i = 0; i < m_pins.size(); i++ ) m_pins[i].SetParent( this ); @@ -207,7 +204,7 @@ bool SCH_SHEET::Load( LINE_READER& aLine, wxString& aErrorMsg ) &m_pos.x, &m_pos.y, &m_size.x, &m_size.y ) != 4 ) || ( ((char*)aLine)[0] != 'S' ) ) { - aErrorMsg.Printf( wxT( " ** Eeschema file sheet error at line %d, aborted\n" ), + aErrorMsg.Printf( wxT( " ** Eeschema file sheet struct error at line %d, aborted\n" ), aLine.LineNumber() ); aErrorMsg << FROM_UTF8( ((char*)aLine) ); @@ -223,10 +220,8 @@ bool SCH_SHEET::Load( LINE_READER& aLine, wxString& aErrorMsg ) if( ((char*)aLine)[0] == 'U' ) { sscanf( ((char*)aLine) + 1, "%lX", &m_TimeStamp ); - if( m_TimeStamp == 0 ) // zero is not unique! SetTimeStamp( GetNewTimeStamp() ); - continue; } @@ -306,7 +301,7 @@ bool SCH_SHEET::Load( LINE_READER& aLine, wxString& aErrorMsg ) if( strnicmp( "$End", ((char*)aLine), 4 ) != 0 ) { - aErrorMsg.Printf( wxT( "**Eeschema file end_sheet error at line %d, aborted\n" ), + aErrorMsg.Printf( wxT( "**Eeschema file end_sheet struct error at line %d, aborted\n" ), aLine.LineNumber() ); aErrorMsg << FROM_UTF8( ((char*)aLine) ); return false; @@ -479,6 +474,9 @@ int SCH_SHEET::GetMinHeight() const } +/** + * Delete sheet labels which do not have corresponding hierarchical label. + */ void SCH_SHEET::CleanupSheet() { SCH_SHEET_PINS::iterator i = m_pins.begin(); @@ -723,15 +721,44 @@ bool SCH_SHEET::SearchHierarchy( const wxString& aFilename, SCH_SCREEN** aScreen } +bool SCH_SHEET::LocatePathOfScreen( SCH_SCREEN* aScreen, SCH_SHEET_PATH* aList ) +{ + if( m_screen ) + { + aList->Push( this ); + + if( m_screen == aScreen ) + return true; + + EDA_ITEM* strct = m_screen->GetDrawItems(); + + while( strct ) + { + if( strct->Type() == SCH_SHEET_T ) + { + SCH_SHEET* ss = (SCH_SHEET*) strct; + + if( ss->LocatePathOfScreen( aScreen, aList ) ) + return true; + } + + strct = strct->Next(); + } + + aList->Pop(); + } + return false; +} + + bool SCH_SHEET::Load( SCH_EDIT_FRAME* aFrame ) { bool success = true; SCH_SCREEN* screen = NULL; - if( !m_screen ) { - GetRootSheet()->SearchHierarchy( m_fileName, &screen ); + g_RootSheet->SearchHierarchy( m_fileName, &screen ); if( screen ) { @@ -755,11 +782,6 @@ bool SCH_SHEET::Load( SCH_EDIT_FRAME* aFrame ) { SCH_SHEET* sheetstruct = (SCH_SHEET*) bs; - // Set the parent to this sheet. This effectively creates the - // schematic sheet hierarchy eliminating the need to keep a - // copy of the root sheet in order to generate the hierarchy. - sheetstruct->SetParent( this ); - if( !sheetstruct->Load( aFrame ) ) success = false; } @@ -791,7 +813,6 @@ int SCH_SHEET::CountSheets() } } } - return count; } @@ -806,15 +827,11 @@ void SCH_SHEET::GetMsgPanelInfo( MSG_PANEL_ITEMS& aList ) { aList.push_back( MSG_PANEL_ITEM( _( "Sheet Name" ), m_name, CYAN ) ); aList.push_back( MSG_PANEL_ITEM( _( "File Name" ), m_fileName, BROWN ) ); - aList.push_back( MSG_PANEL_ITEM( _( "Path" ), GetHumanReadablePath(), DARKMAGENTA ) ); - if( IsRootSheet() ) - aList.push_back( MSG_PANEL_ITEM( _( "Hierarchy Type" ), - IsComplexHierarchy() ? _( "Complex" ) : _( "Simple" ), - GREEN ) ); - -#if 1 // Set to 1 to display the sheet time stamp (mainly for test) - aList.push_back( MSG_PANEL_ITEM( _( "Time Stamp" ), GetPath(), BLUE ) ); +#if 0 // Set to 1 to display the sheet time stamp (mainly for test) + wxString msg; + msg.Printf( wxT( "%.8X" ), m_TimeStamp ); + aList.push_back( MSG_PANEL_ITEM( _( "Time Stamp" ), msg, BLUE ) ); #endif } @@ -1131,6 +1148,7 @@ void SCH_SHEET::Plot( PLOTTER* aPlotter ) Text = m_name; size = wxSize( m_sheetNameSize, m_sheetNameSize ); + //pos = m_pos; pos.y -= 4; thickness = GetDefaultLineThickness(); thickness = Clamp_Text_PenSize( thickness, size, false ); @@ -1163,312 +1181,6 @@ void SCH_SHEET::Plot( PLOTTER* aPlotter ) } -void SCH_SHEET::SetPageNumbers() -{ - int pageNumber = 1; - std::vector< const SCH_SHEET* > sheets; - - GetRootSheet()->GetSheets( sheets ); - - for( unsigned i = 0; i < sheets.size(); i++ ) - { - const_cast< SCH_SHEET* >( sheets[i] )->m_number = pageNumber; - pageNumber += 1; - } -} - - -SCH_SHEET* SCH_SHEET::FindSheetByName( const wxString& aSheetName ) -{ - std::vector< const SCH_SHEET* > sheets; - - GetSheets( sheets ); - - for( unsigned i = 0; i < sheets.size(); i++ ) - { - if( sheets[i]->GetName().CmpNoCase( aSheetName ) == 0 ) - return const_cast< SCH_SHEET* >( sheets[i] ); - } - - return NULL; -} - - -unsigned SCH_SHEET::GetSheets( std::vector< const SCH_SHEET* >& aSheetList, - bool aSortByPath ) const -{ - // Sheet pointers must be unique. - wxASSERT( find( aSheetList.begin(), aSheetList.end(), this ) == aSheetList.end() ); - - aSheetList.push_back( this ); - - const SCH_ITEM* item = m_screen->GetDrawItems(); - - while( item ) - { - if( item->Type() == SCH_SHEET_T ) - ( (SCH_SHEET*) item )->GetSheets( aSheetList ); - - item = item->Next(); - } - - if( aSortByPath ) - std::sort( aSheetList.begin(), aSheetList.end(), SortByPath() ); - - return aSheetList.size(); -} - - -void SCH_SHEET::GetSheetPaths( std::vector< std::vector< const SCH_SHEET* > >& aSheetPaths ) const -{ - static std::vector< const SCH_SHEET* > path; - - path.push_back( const_cast< SCH_SHEET* >( this ) ); - aSheetPaths.push_back( path ); - - SCH_ITEM* item = m_screen->GetDrawItems(); - - while( item ) - { - if( item->Type() == SCH_SHEET_T ) - ( (SCH_SHEET*) item )->GetSheetPaths( aSheetPaths ); - - item = item->Next(); - } - - path.pop_back(); -} - - -const SCH_SHEET* SCH_SHEET::GetRootSheet() const -{ - EDA_ITEM* parent = GetParent(); - const SCH_SHEET* rootSheet = const_cast< SCH_SHEET* >( this ); - - while( parent ) - { - // The parent of a SCH_SHEET object can only be another SCH_SHEET object or NULL. - wxASSERT_MSG( parent->Type() == SCH_SHEET_T, "SCH_SHEET parent is not a SCH_SHEET" ); - rootSheet = static_cast( parent ); - parent = parent->GetParent(); - } - - return const_cast< SCH_SHEET* >( rootSheet ); -} - - -void SCH_SHEET::GetPath( std::vector< const SCH_SHEET* >& aSheetPath ) const -{ - aSheetPath.insert( aSheetPath.begin(), const_cast( this ) ); - - if( GetParent() ) - static_cast( GetParent() )->GetPath( aSheetPath ); -} - - -wxString SCH_SHEET::GetPath() const -{ - wxString tmp; - wxString path = "/"; - const SCH_SHEET* sheet = this; - - while( sheet->GetParent() ) - { - tmp.Printf( "/%8.8lX", (long unsigned) sheet->GetTimeStamp() ); - - // We are walking up the parent stack so prepend each time stamp. - path = tmp + path; - sheet = static_cast( sheet->GetParent() ); - } - - return path; -} - - -wxString SCH_SHEET::GetHumanReadablePath() const -{ - wxString path = "/"; - const SCH_SHEET* sheet = this; - - while( sheet->GetParent() ) - { - // We are walking up the parent stack so prepend each sheet name. - path = "/" + sheet->GetName() + path; - sheet = static_cast( sheet->GetParent() ); - } - - return path; -} - - -void SCH_SHEET::ClearAnnotation( bool aIncludeSubSheets ) -{ - m_screen->ClearAnnotation( this ); - - if( aIncludeSubSheets ) - { - SCH_ITEM* item = m_screen->GetDrawItems(); - - while( item ) - { - if( item->Type() == SCH_SHEET_T ) - static_cast( item )->ClearAnnotation( aIncludeSubSheets ); - - item = item->Next(); - } - } -} - - -bool SCH_SHEET::IsModified() const -{ - if( m_screen->IsModify() ) - return true; - - bool retv = false; - SCH_ITEM* item = m_screen->GetDrawItems(); - - while( item && !retv ) - { - if( item->Type() == SCH_SHEET_T ) - retv = static_cast( item )->IsModified(); - - item = item->Next(); - } - - return retv; -} - - -bool SCH_SHEET::IsAutoSaveRequired() -{ - if( m_screen->IsModify() ) - return true; - - bool retv = false; - SCH_ITEM* item = m_screen->GetDrawItems(); - - while( item && !retv ) - { - if( item->Type() == SCH_SHEET_T ) - { - SCH_SHEET* sheet = static_cast( item ); - - if( sheet->m_screen ) - retv = sheet->m_screen->IsSave(); - } - - item = item->Next(); - } - - return retv; -} - - -void SCH_SHEET::ClearModifyStatus() -{ - m_screen->ClrModify(); - - SCH_ITEM* item = m_screen->GetDrawItems(); - - while( item ) - { - if( item->Type() == SCH_SHEET_T ) - static_cast( item )->m_screen->ClrModify(); - - item = item->Next(); - } -} - - -void SCH_SHEET::AnnotatePowerSymbols( PART_LIBS* aLibs, int* aReference ) -{ - int ref = 1; - - if( aReference ) - ref = *aReference; - - for( EDA_ITEM* item = m_screen->GetDrawItems(); item; item = item->Next() ) - { - if( item->Type() != SCH_COMPONENT_T ) - continue; - - SCH_COMPONENT* component = (SCH_COMPONENT*) item; - LIB_PART* part = aLibs->FindLibPart( component->GetPartName() ); - - if( !part || !part->IsPower() ) - continue; - - wxString refstr = component->GetPrefix(); - - //str will be "C?" or so after the ClearAnnotation call. - while( refstr.Last() == '?' ) - refstr.RemoveLast(); - - if( !refstr.StartsWith( wxT( "#" ) ) ) - refstr = wxT( "#" ) + refstr; - - refstr << wxT( "0" ) << ref; - component->SetRef( this, refstr ); - ref++; - } - - if( aReference ) - *aReference = ref; -} - - -void SCH_SHEET::UpdateAllScreenReferences() -{ - EDA_ITEM* t = m_screen->GetDrawItems(); - - while( t ) - { - if( t->Type() == SCH_COMPONENT_T ) - { - SCH_COMPONENT* component = (SCH_COMPONENT*) t; - component->GetField( REFERENCE )->SetText( component->GetRef( this ) ); - component->UpdateUnit( component->GetUnitSelection( this ) ); - } - - t = t->Next(); - } -} - - -void SCH_SHEET::GetComponents( PART_LIBS* aLibs, SCH_REFERENCE_LIST& aReferences, - bool aIncludePowerSymbols, bool aIncludeSubSheets ) -{ - for( SCH_ITEM* item = m_screen->GetDrawItems(); item; item = item->Next() ) - { - if( item->Type() == SCH_SHEET_T && aIncludeSubSheets ) - { - ((SCH_SHEET*)item)->GetComponents( aLibs, aReferences, aIncludePowerSymbols, - aIncludeSubSheets ); - } - - if( item->Type() == SCH_COMPONENT_T ) - { - SCH_COMPONENT* component = (SCH_COMPONENT*) item; - - // Skip pseudo components, which have a reference starting with #. This mainly - // affects power symbols. - if( !aIncludePowerSymbols && component->GetRef( this )[0] == wxT( '#' ) ) - continue; - - LIB_PART* part = aLibs->FindLibPart( component->GetPartName() ); - - if( part ) - { - SCH_REFERENCE reference = SCH_REFERENCE( component, part, this ); - reference.SetSheetNumber( m_number ); - aReferences.AddItem( reference ); - } - } - } -} - - SCH_ITEM& SCH_SHEET::operator=( const SCH_ITEM& aItem ) { wxLogDebug( wxT( "Sheet assignment operator." ) ); @@ -1502,221 +1214,6 @@ SCH_ITEM& SCH_SHEET::operator=( const SCH_ITEM& aItem ) } -void SCH_SHEET::GetMultiUnitComponents( PART_LIBS* aLibs, - SCH_MULTI_UNIT_REFERENCE_MAP& aRefList, - bool aIncludePowerSymbols ) -{ - for( SCH_ITEM* item = m_screen->GetDrawItems(); item; item = item->Next() ) - { - if( item->Type() == SCH_SHEET_T ) - { - ( (SCH_SHEET*) item )->GetMultiUnitComponents( aLibs, aRefList, aIncludePowerSymbols ); - continue; - } - - if( item->Type() != SCH_COMPONENT_T ) - continue; - - SCH_COMPONENT* component = (SCH_COMPONENT*) item; - - // Skip pseudo components, which have a reference starting with #. This mainly - // affects power symbols. - if( !aIncludePowerSymbols && component->GetRef( this )[0] == wxT( '#' ) ) - continue; - - LIB_PART* part = aLibs->FindLibPart( component->GetPartName() ); - - if( part && part->GetUnitCount() > 1 ) - { - SCH_REFERENCE reference = SCH_REFERENCE( component, part, this ); - reference.SetSheetNumber( m_number ); - wxString reference_str = reference.GetRef(); - - // Never lock unassigned references - if( reference_str[reference_str.Len() - 1] == '?' ) - continue; - - aRefList[reference_str].AddItem( reference ); - } - } -} - - -bool SCH_SHEET::IsComplexHierarchy() const -{ - std::set fileNames; - std::vector< const SCH_SHEET* > sheets; - - unsigned count = GetSheets( sheets ); - - for( unsigned i = 0; i < count; i++ ) - { - if( fileNames.find( sheets[i]->m_fileName ) != fileNames.end() ) - return true; - - fileNames.insert( sheets[i]->m_fileName ); - } - - return false; -} - - -SCH_ITEM* SCH_SHEET::FindNextItem( KICAD_T aType, SCH_ITEM* aLastItem, bool aWrap ) const -{ - wxCHECK( m_screen != NULL, NULL ); - - bool hasWrapped = false; - bool firstItemFound = false; - SCH_ITEM* drawItem = m_screen->GetDrawItems(); - - while( drawItem ) - { - if( drawItem->Type() == aType ) - { - if( !aLastItem || firstItemFound ) - { - return drawItem; - } - else if( !firstItemFound && drawItem == aLastItem ) - { - firstItemFound = true; - } - } - - drawItem = drawItem->Next(); - - if( !drawItem && aLastItem && aWrap && !hasWrapped ) - { - hasWrapped = true; - drawItem = m_screen->GetDrawItems(); - } - } - - return NULL; -} - - -bool SCH_SHEET::operator<( const SCH_SHEET& aRhs ) const -{ - if( (*this - aRhs) < 0 ) - return true; - - return false; -} - - -int SCH_SHEET::operator-( const SCH_SHEET& aRhs ) const -{ - // Don't waste time against comparing the same objects.. - if( this == &aRhs ) - return 0; - - std::vector< const SCH_SHEET* > lhsPath, rhsPath; - - GetPath( lhsPath ); - aRhs.GetPath( rhsPath ); - - // Shorter paths are less than longer paths. - int retv = lhsPath.size() - rhsPath.size(); - - if( retv == 0 ) - { - // Compare time stamps when path lengths are the same. - for( unsigned i = 0; i < lhsPath.size(); i++ ) - { - retv = lhsPath[i]->GetTimeStamp() - rhsPath[i]->GetTimeStamp(); - - if( retv != 0 ) - break; - } - } - - return retv; -} - - -bool SCH_SHEET::TestForRecursion( std::vector< std::vector< const SCH_SHEET* > >& aSrcSheetHierarchy, - const wxString& aDestFileName ) const -{ - std::vector< std::vector< const SCH_SHEET* > > hierarchy; - wxFileName rootFn = GetRootSheet()->GetFileName(); - wxFileName destFn = aDestFileName; - - if( destFn.IsRelative() ) - destFn.MakeAbsolute( rootFn.GetPath() ); - - GetRootSheet()->GetSheetPaths( hierarchy ); - - // Test each SCH_SHEET_PATH in this SCH_SHEET_LIST for potential recursion. - for( unsigned i = 0; i < hierarchy.size(); i++ ) - { - // Test each SCH_SHEET_PATH in the source sheet. - for( unsigned j = 0; j < aSrcSheetHierarchy.size(); j++ ) - { - std::vector< const SCH_SHEET* > sheetPath = aSrcSheetHierarchy[ j ]; - - for( unsigned k = 0; k < sheetPath.size(); k++ ) - { - wxFileName srcFn = sheetPath[k]->GetFileName(); - - if( srcFn.IsRelative() ) - srcFn.MakeAbsolute( rootFn.GetPath() ); - - // The source and destination sheet file names cannot be the same. - if( srcFn == destFn ) - return true; - - /// @todo Store sheet file names with full path, either relative to project path - /// or absolute path. The current design always assumes subsheet files are - /// located in the project folder which may or may not be desirable. - std::vector< const SCH_SHEET* > destPath = hierarchy[i]; - unsigned l = 0; - - while( l < destPath.size() ) - { - wxFileName cmpFn = destPath[i]->GetFileName(); - - if( cmpFn.IsRelative() ) - cmpFn.MakeAbsolute( rootFn.GetPath() ); - - // Test if the file name of the destination sheet is in anywhere in the - // source sheet path. - if( cmpFn == destFn ) - break; - - l++; - } - - // The destination sheet file name was not found in the any of the source sheet - // path or the destination sheet file name is the root sheet so no recursion is - // possible. - if( l >= destPath.size() || l == 0 ) - return false; - - // Walk back up to the root sheet to see if the source file name is already a - // parent in destination the sheet path. If so, recursion will occur. - do - { - l -= 1; - - wxFileName cmpFn = destPath[i]->GetFileName(); - - if( cmpFn.IsRelative() ) - cmpFn.MakeAbsolute( rootFn.GetPath() ); - - if( cmpFn == srcFn ) - return true; - - } while( l != 0 ); - } - } - } - - // The source sheet file can safely be added to the destination sheet file. - return false; -} - - #if defined(DEBUG) void SCH_SHEET::Show( int nestLevel, std::ostream& os ) const diff --git a/eeschema/sch_sheet.h b/eeschema/sch_sheet.h index f5182f8b97..3304a0d751 100644 --- a/eeschema/sch_sheet.h +++ b/eeschema/sch_sheet.h @@ -33,10 +33,8 @@ #include #include #include -#include -class PART_LIBS; class LINE_READER; class SCH_SCREEN; class SCH_SHEET; @@ -245,13 +243,6 @@ class SCH_SHEET : public SCH_ITEM /// The size of the sheet. wxSize m_size; - /// The sheet number ordered by file load. - // @todo: At some point this should really be a sheet number assigned by the user rather - // than assigned in the order the sheets were parsed and loaded. - int m_number; - - SCH_SHEET* getRootSheet(); - public: SCH_SHEET( const wxPoint& pos = wxPoint( 0, 0 ) ); @@ -274,7 +265,7 @@ public: * Return true for items which are moved with the anchor point at mouse cursor * and false for items moved with no reference to anchor * Usually return true for small items (labels, junctions) and false for - * items which can be large (hierarchical sheets, components) + * items which can be large (hierarchical sheets, compoments) * @return false for a hierarchical sheet */ bool IsMovableFromAnchorPoint() { return false; } @@ -466,6 +457,19 @@ public: */ bool SearchHierarchy( const wxString& aFilename, SCH_SCREEN** aScreen ); + /** + * Function LocatePathOfScreen + * search the existing hierarchy for an instance of screen "FileName". + * don't bother looking at the root sheet - it must be unique, + * no other references to its m_screen otherwise there would be + * loops in the hierarchy. + * + * @param aScreen = the SCH_SCREEN* screen that we search for + * @param aList = the SCH_SHEET_PATH* that must be used + * @return true if found + */ + bool LocatePathOfScreen( SCH_SCREEN* aScreen, SCH_SHEET_PATH* aList ); + /** * Function CountSheets * calculates the number of sheets found in "this" @@ -486,7 +490,7 @@ public: { m_fileName = aFilename; // Filenames are stored using unix notation - m_fileName.Replace( wxT( "\\" ), wxT( "/" ) ); + m_fileName.Replace( wxT("\\"), wxT("/") ); } bool ChangeFileName( SCH_EDIT_FRAME* aFrame, const wxString& aFileName ); @@ -551,7 +555,7 @@ public: void GetConnectionPoints( std::vector< wxPoint >& aPoints ) const; SEARCH_RESULT Visit( INSPECTOR* inspector, const void* testData, - const KICAD_T scanTypes[] ); + const KICAD_T scanTypes[] ); wxString GetSelectMenuText() const; @@ -562,42 +566,6 @@ public: SCH_ITEM& operator=( const SCH_ITEM& aSheet ); - /** - * Operator < - * - * test if a \a aRhs is less than this sheet. - * - * Sheet comparison order is: - * The number of parent sheets of this sheet is less than \a aRhs. - * When the number of parent sheets for this sheet are the same as \a aRhs, the time - * stamps of each parent sheet are compared from the root sheet to the last sheet. - * - * @param aRhs is an SCH_SHEET reference to the right hand side of the comparison. - * @return true if this #SCH_SHEET is less than \a aRhs. - */ - bool operator<( const SCH_SHEET& aRhs ) const; - - /** - * Structure SortByPath - * - * tests if \a aLhs is less than \a aRhs. - * - * @param aLhs is the left hand side reference to a #SCH_SHEET for comparison. - * @param aRhs is the right hand side reference to a #SCH_SHEET for comparison. - * @return true if \a aLhs is less than \a aRhs otherwise false. - */ - struct SortByPath - { - bool operator()( const SCH_SHEET* aLhs, const SCH_SHEET* aRhs ) - { - wxCHECK( aLhs != NULL && aRhs != NULL, false ); - - return *aLhs < *aRhs; - } - }; - - int operator-( const SCH_SHEET& aRhs ) const; - wxPoint GetPosition() const { return m_pos; } void SetPosition( const wxPoint& aPosition ); @@ -610,225 +578,6 @@ public: EDA_ITEM* Clone() const; - /** - * Function SetPageNumbers - * - * sets the page numbers for each sheet by load order. - * - * The root sheet is always used to set the page numbers no matter which sheet this - * function is called. This function will only have meaning when loading legacy - * schematics. The upcoming s-expression schematic file format will allow for user - * defined page numbers. - */ - void SetPageNumbers(); - - /** - * Function FindSheetByName - * - * searches this #SCH_SHEET and all of it's sub-sheets for a sheet named \a aSheetName. - * - * @param aSheetName is the name of the sheet to find. - * @return a pointer to the sheet named \a aSheetName if found or NULL if not found. - */ - SCH_SHEET* FindSheetByName( const wxString& aSheetName ); - - /** - * Function GetSheets - * - * add the pointers to the #SCH_SHEET and all of it's sub-sheets to \a aSheetList. - * - * By default no sorting is performed and the #SCH_SHEET pointers are add to the list - * in the order they were loaded when the schematic was parse. When \a aSortByPath is - * true, the list is sorted using the < operator which sort by path length then path - * time stamps. This has the same sorting effect as the old SCH_SHEET_PATH::Cmp() - * function. - * - * @param aSheetList is a reference to a set containing the #SCH_SHEET pointers. - * @param aSortByPath true to sort by path. False for load order. - * @return the number of #SCH_SHEET object pointers in \a aSheetList. - */ - unsigned GetSheets( std::vector< const SCH_SHEET* >& aSheetList, - bool aSortByPath = false ) const; - - /** - * Function GetSheetPaths - * - * Returns a list of lists of #SCH_SHEET pointers to \a sSheetPaths. - * - * This is analagous to the old SCH_SHEET_LIST::BuildSheetList(). It creates a list of - * stacks to the sheet pointer hierarchy. - * - * @param aSheetPaths is a vector of vector of #SCH_SHEET pointers. - */ - void GetSheetPaths( std::vector< std::vector< const SCH_SHEET* > >& aSheetPaths ) const; - - /** - * Function GetRootSheet - * - * returns the root sheet of this SCH_SHEET object. - * - * The root (top level) sheet can be found by walking up the parent links until the only - * sheet that has no parent is found. The root sheet can be found from any sheet in the - * hierarchy. - * - * @return a SCH_SHEET pointer to the root sheet. - */ - const SCH_SHEET* GetRootSheet() const; - - SCH_SHEET* GetRootSheet() - { - return const_cast< SCH_SHEET* >( static_cast< const SCH_SHEET&>( *this ).GetRootSheet() ); - } - - /** - * Function IsRootSheet - * - * returns true if `this` sheet has no parent which indicates it is the root (top level) - * sheet. - * - * @return true if this is the root sheet, otherwise false. - */ - bool IsRootSheet() const { return GetParent() == NULL; } - - /** - * Function GetPath - * - * recurses up the parent branch up to the root sheet adding a pointer for each - * parent sheet to \a aSheetPath. - * - * @param aSheetPath is a refernce to an #SCH_SHEET object to populate. - */ - void GetPath( std::vector< const SCH_SHEET* >& aSheetPath ) const; - - /** - * Function GetPath - * - * returns a wxString containing the sheet path of this SCH_SHEET. - * - * The SCH_SHEET path is a Posix like path containing the hexadecimal time stamps in - * the parent order of this SCH_SHEET. It looks something like /4567FEDC/AA2233DD/. - */ - wxString GetPath() const; - - /** - * Function GetHumanReadablePath - * - * returns a wxString containing the human readable path of this sheet. - * - * Human readable SCH_SHEET paths are Posix like paths made up of the sheet names - * in the parent order of this SCH_SHEET. It looks something like /sheet1/sheet2. - */ - wxString GetHumanReadablePath() const; - - void ClearAnnotation( bool aIncludeSubSheets = false ); - - /** - * Function IsModified - * checks the sheet and any of it's sub-sheets (hierarchy) for any modifications. - * @return true if the hierarchy is modified otherwise false. - */ - bool IsModified() const; - - /** - * Function ClearModifyStatus - * - * clears the modification flag for everything in the sheet and all sub-sheets. - */ - void ClearModifyStatus(); - - /** - * Function IsAutoSaveRequired - * checks the entire hierarchy for any modifications that require auto save. - * @return True if the hierarchy is modified otherwise false. - */ - bool IsAutoSaveRequired(); - - /** - * Function AnnotatePowerSymbols - * annotates the power symbols only starting at \a aReference in the sheet path. - * @param aLibs the library list to use - * @param aReference A pointer to the number for the reference designator of the - * first power symbol to be annotated. If the pointer is NULL - * the annotation starts at 1. The number is incremented for - * each power symbol in the sheet that is annotated. - */ - void AnnotatePowerSymbols( PART_LIBS* aLibs, int* aReference ); - - /** - * Function UpdateAllScreenReferences - * updates the reference and the m_Multi parameter (part selection) for all - * components on a screen depending on the actual sheet. - * Mandatory in complex hierarchies because sheets use the same screen - * (basic schematic) - * but with different references and part selections according to the - * displayed sheet - */ - void UpdateAllScreenReferences(); - - /** - * Function GetComponents - * adds a SCH_REFERENCE() object to \a aReferences for each component in the sheet. - * - * @param aLibs the library list to use - * @param aReferences List of references to populate. - * @param aIncludePowerSymbols : false to only get normal components. - * @param aIncludeSubSheets true includes components of all sub-sheets and false includes - * only the components in this sheet. - */ - void GetComponents( PART_LIBS* aLibs, SCH_REFERENCE_LIST& aReferences, - bool aIncludePowerSymbols = true, bool aIncludeSubSheets = true ); - - /** - * Function GetMultiUnitComponents - * adds a SCH_REFERENCE_LIST object to \a aRefList for each component with multiple units - * that has the same reference designator for this sheet and all of it's sub-sheets. The - * map key for each element will be the reference designator. - * - * @param aLibs a pointer to the #PART_LIB to use. - * @param aRefList Map of reference designators to reference lists - * @param aIncludePowerSymbols : false to only get normal components. - */ - void GetMultiUnitComponents( PART_LIBS* aLibs, SCH_MULTI_UNIT_REFERENCE_MAP& aRefList, - bool aIncludePowerSymbols = true ); - - /** - * Function IsComplexHierarchy - * searches all of the sheets for duplicate files names which indicates a complex - * hierarchy. - * - * Typically this function would be called from the root sheet. However, it is possible - * to test only the sub-hierarchy from any #SCH_SHEET object. - * - * @return true if the #SCH_SHEET is a complex hierarchy. - */ - bool IsComplexHierarchy() const; - - /** - * Find the next schematic item in this sheet object. - * - * @param aType - The type of schematic item object to search for. - * @param aLastItem - Start search from aLastItem. If no aLastItem, search from - * the beginning of the list. - * @param aWrap - Wrap around the end of the list to find the next item if aLastItem - * is defined. - * @return - The next schematic item if found. Otherwise, NULL is returned. - */ - SCH_ITEM* FindNextItem( KICAD_T aType, SCH_ITEM* aLastItem = NULL, bool aWrap = false ) const; - - /** - * Function TestForRecursion - * - * test every SCH_SHEET in the SCH_SHEET hierarchy to verify if adding the sheets stored - * in \a aSrcSheetHierarchy to the sheet stored in \a aDestFileName will cause recursion. - * - * @param aSrcSheetHierarchy is a list #SCH_SHEET pointer lists of the source sheet add - * to \a aDestFileName. - * @param aDestFileName is the file name of the destination sheet for \a aSrcFileName. - * @return true if \a aFileName will cause recursion in the sheet path. Otherwise false. - */ - bool TestForRecursion( std::vector< std::vector< const SCH_SHEET* > >& aSrcSheetHierarchy, - const wxString& aDestFileName ) const; - #if defined(DEBUG) void Show( int nestLevel, std::ostream& os ) const; // override #endif @@ -846,4 +595,6 @@ protected: }; +typedef std::vector< SCH_SHEET* > SCH_SHEETS; + #endif /* SCH_SHEEET_H */ diff --git a/eeschema/sch_sheet_path.cpp b/eeschema/sch_sheet_path.cpp index 7723e5f4f1..790a22cbd8 100644 --- a/eeschema/sch_sheet_path.cpp +++ b/eeschema/sch_sheet_path.cpp @@ -2,8 +2,8 @@ * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2009 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com - * Copyright (C) 2011-2015 Wayne Stambaugh - * Copyright (C) 1992-2015 KiCad Developers, see AUTHORS.txt for contributors. + * Copyright (C) 2011 Wayne Stambaugh + * Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -227,6 +227,169 @@ wxString SCH_SHEET_PATH::PathHumanReadable() const } +void SCH_SHEET_PATH::UpdateAllScreenReferences() +{ + EDA_ITEM* t = LastDrawList(); + + while( t ) + { + if( t->Type() == SCH_COMPONENT_T ) + { + SCH_COMPONENT* component = (SCH_COMPONENT*) t; + component->GetField( REFERENCE )->SetText( component->GetRef( this ) ); + component->UpdateUnit( component->GetUnitSelection( this ) ); + } + + t = t->Next(); + } +} + + +void SCH_SHEET_PATH::AnnotatePowerSymbols( PART_LIBS* aLibs, int* aReference ) +{ + int ref = 1; + + if( aReference ) + ref = *aReference; + + for( EDA_ITEM* item = LastDrawList(); item; item = item->Next() ) + { + if( item->Type() != SCH_COMPONENT_T ) + continue; + + SCH_COMPONENT* component = (SCH_COMPONENT*) item; + LIB_PART* part = aLibs->FindLibPart( component->GetPartName() ); + + if( !part || !part->IsPower() ) + continue; + + wxString refstr = component->GetPrefix(); + + //str will be "C?" or so after the ClearAnnotation call. + while( refstr.Last() == '?' ) + refstr.RemoveLast(); + + if( !refstr.StartsWith( wxT( "#" ) ) ) + refstr = wxT( "#" ) + refstr; + + refstr << wxT( "0" ) << ref; + component->SetRef( this, refstr ); + ref++; + } + + if( aReference ) + *aReference = ref; +} + + +void SCH_SHEET_PATH::GetComponents( PART_LIBS* aLibs, SCH_REFERENCE_LIST& aReferences, bool aIncludePowerSymbols ) +{ + // Search to sheet path number: + int sheetnumber = 1; // 1 = root + + SCH_SHEET_LIST sheetList; + + for( SCH_SHEET_PATH* path = sheetList.GetFirst(); path; path = sheetList.GetNext(), sheetnumber++ ) + { + if( Cmp( *path ) == 0 ) + break; + } + + for( SCH_ITEM* item = LastDrawList(); item; item = item->Next() ) + { + if( item->Type() == SCH_COMPONENT_T ) + { + SCH_COMPONENT* component = (SCH_COMPONENT*) item; + + // Skip pseudo components, which have a reference starting with #. This mainly + // affects power symbols. + if( !aIncludePowerSymbols && component->GetRef( this )[0] == wxT( '#' ) ) + continue; + + LIB_PART* part = aLibs->FindLibPart( component->GetPartName() ); + if( part ) + { + SCH_REFERENCE reference = SCH_REFERENCE( component, part, *this ); + reference.SetSheetNumber( sheetnumber ); + aReferences.AddItem( reference ); + } + } + } +} + +void SCH_SHEET_PATH::GetMultiUnitComponents( PART_LIBS* aLibs, SCH_MULTI_UNIT_REFERENCE_MAP &aRefList, + bool aIncludePowerSymbols ) +{ + // Find sheet path number + int sheetnumber = 1; // 1 = root + + SCH_SHEET_LIST sheetList; + + for( SCH_SHEET_PATH* path = sheetList.GetFirst(); path; path = sheetList.GetNext(), sheetnumber++ ) + { + if( Cmp( *path ) == 0 ) + break; + } + + for( SCH_ITEM* item = LastDrawList(); item; item = item->Next() ) + { + if( item->Type() != SCH_COMPONENT_T ) continue; + SCH_COMPONENT* component = (SCH_COMPONENT*) item; + + // Skip pseudo components, which have a reference starting with #. This mainly + // affects power symbols. + if( !aIncludePowerSymbols && component->GetRef( this )[0] == wxT( '#' ) ) + continue; + + LIB_PART* part = aLibs->FindLibPart( component->GetPartName() ); + if( part && part->GetUnitCount() > 1 ) + { + SCH_REFERENCE reference = SCH_REFERENCE( component, part, *this ); + reference.SetSheetNumber( sheetnumber ); + wxString reference_str = reference.GetRef(); + + // Never lock unassigned references + if( reference_str[reference_str.Len() - 1] == '?' ) continue; + + aRefList[reference_str].AddItem( reference ); + } + } +} + + +SCH_ITEM* SCH_SHEET_PATH::FindNextItem( KICAD_T aType, SCH_ITEM* aLastItem, bool aWrap ) const +{ + bool hasWrapped = false; + bool firstItemFound = false; + SCH_ITEM* drawItem = LastDrawList(); + + while( drawItem ) + { + if( drawItem->Type() == aType ) + { + if( !aLastItem || firstItemFound ) + { + return drawItem; + } + else if( !firstItemFound && drawItem == aLastItem ) + { + firstItemFound = true; + } + } + + drawItem = drawItem->Next(); + + if( !drawItem && aLastItem && aWrap && !hasWrapped ) + { + hasWrapped = true; + drawItem = LastDrawList(); + } + } + + return NULL; +} + + SCH_ITEM* SCH_SHEET_PATH::FindPreviousItem( KICAD_T aType, SCH_ITEM* aLastItem, bool aWrap ) const { bool hasWrapped = false; @@ -260,6 +423,18 @@ SCH_ITEM* SCH_SHEET_PATH::FindPreviousItem( KICAD_T aType, SCH_ITEM* aLastItem, } +bool SCH_SHEET_PATH::SetComponentFootprint( const wxString& aReference, const wxString& aFootPrint, + bool aSetVisible ) +{ + SCH_SCREEN* screen = LastScreen(); + + if( screen == NULL ) + return false; + + return screen->SetComponentFootprint( this, aReference, aFootPrint, aSetVisible ); +} + + SCH_SHEET_PATH& SCH_SHEET_PATH::operator=( const SCH_SHEET_PATH& d1 ) { if( this == &d1 ) // Self assignment is bad! @@ -294,6 +469,93 @@ bool SCH_SHEET_PATH::operator==( const SCH_SHEET_PATH& d1 ) const } +bool SCH_SHEET_PATH::TestForRecursion( const wxString& aSrcFileName, + const wxString& aDestFileName ) const +{ + wxFileName rootFn = g_RootSheet->GetFileName(); + wxFileName srcFn = aSrcFileName; + wxFileName destFn = aDestFileName; + + if( srcFn.IsRelative() ) + srcFn.MakeAbsolute( rootFn.GetPath() ); + + if( destFn.IsRelative() ) + destFn.MakeAbsolute( rootFn.GetPath() ); + + + // The source and destination sheet file names cannot be the same. + if( srcFn == destFn ) + return true; + + /// @todo Store sheet file names with full path, either relative to project path + /// or absolute path. The current design always assumes subsheet files are + /// located in the project folder which may or may not be desirable. + unsigned i = 0; + + while( i < m_numSheets ) + { + wxFileName cmpFn = m_sheets[i]->GetFileName(); + + if( cmpFn.IsRelative() ) + cmpFn.MakeAbsolute( rootFn.GetPath() ); + + // Test if the file name of the destination sheet is in anywhere in this sheet path. + if( cmpFn == destFn ) + break; + + i++; + } + + // The destination sheet file name was not found in the sheet path or the destination + // sheet file name is the root sheet so no recursion is possible. + if( i >= m_numSheets || i == 0 ) + return false; + + // Walk back up to the root sheet to see if the source file name is already a parent in + // the sheet path. If so, recursion will occur. + do + { + i -= 1; + + wxFileName cmpFn = m_sheets[i]->GetFileName(); + + if( cmpFn.IsRelative() ) + cmpFn.MakeAbsolute( rootFn.GetPath() ); + + if( cmpFn == srcFn ) + return true; + + } while( i != 0 ); + + // The source sheet file name is not a parent of the destination sheet file name. + return false; +} + + +int SCH_SHEET_PATH::FindSheet( const wxString& aFileName ) const +{ + for( unsigned i = 0; i < m_numSheets; i++ ) + { + if( m_sheets[i]->GetFileName().CmpNoCase( aFileName ) == 0 ) + return (int)i; + } + + return SHEET_NOT_FOUND; +} + + +SCH_SHEET* SCH_SHEET_PATH::FindSheetByName( const wxString& aSheetName ) +{ + for( unsigned i = 0; i < m_numSheets; i++ ) + { + if( m_sheets[i]->GetName().CmpNoCase( aSheetName ) == 0 ) + return m_sheets[i]; + } + + return NULL; +} + + /********************************************************************/ /* Class SCH_SHEET_LIST to handle the list of Sheets in a hierarchy */ /********************************************************************/ @@ -422,6 +684,76 @@ void SCH_SHEET_LIST::BuildSheetList( SCH_SHEET* aSheet ) } +bool SCH_SHEET_LIST::IsModified() +{ + for( SCH_SHEET_PATH* sheet = GetFirst(); sheet; sheet = GetNext() ) + { + if( sheet->LastScreen() && sheet->LastScreen()->IsModify() ) + return true; + } + + return false; +} + + +bool SCH_SHEET_LIST::IsAutoSaveRequired() +{ + for( SCH_SHEET_PATH* sheet = GetFirst(); sheet; sheet = GetNext() ) + { + if( sheet->LastScreen() && sheet->LastScreen()->IsSave() ) + return true; + } + + return false; +} + + +void SCH_SHEET_LIST::ClearModifyStatus() +{ + for( SCH_SHEET_PATH* sheet = GetFirst(); sheet; sheet = GetNext() ) + { + if( sheet->LastScreen() ) + sheet->LastScreen()->ClrModify(); + } +} + + +void SCH_SHEET_LIST::AnnotatePowerSymbols( PART_LIBS* aLibs ) +{ + int ref = 1; + + for( SCH_SHEET_PATH* path = GetFirst(); path; path = GetNext() ) + path->AnnotatePowerSymbols( aLibs, &ref ); +} + + +void SCH_SHEET_LIST::GetComponents( PART_LIBS* aLibs, SCH_REFERENCE_LIST& aReferences, + bool aIncludePowerSymbols ) +{ + for( SCH_SHEET_PATH* path = GetFirst(); path; path = GetNext() ) + path->GetComponents( aLibs, aReferences, aIncludePowerSymbols ); +} + +void SCH_SHEET_LIST::GetMultiUnitComponents( PART_LIBS* aLibs, + SCH_MULTI_UNIT_REFERENCE_MAP &aRefList, bool aIncludePowerSymbols ) +{ + for( SCH_SHEET_PATH* path = GetFirst(); path; path = GetNext() ) + { + SCH_MULTI_UNIT_REFERENCE_MAP tempMap; + path->GetMultiUnitComponents( aLibs, tempMap ); + BOOST_FOREACH( SCH_MULTI_UNIT_REFERENCE_MAP::value_type& pair, tempMap ) + { + // Merge this list into the main one + unsigned n_refs = pair.second.GetCount(); + for( unsigned thisRef = 0; thisRef < n_refs; ++thisRef ) + { + aRefList[pair.first].AddItem( pair.second[thisRef] ); + } + } + } +} + + SCH_ITEM* SCH_SHEET_LIST::FindNextItem( KICAD_T aType, SCH_SHEET_PATH** aSheetFoundIn, SCH_ITEM* aLastItem, bool aWrap ) { @@ -511,3 +843,82 @@ SCH_ITEM* SCH_SHEET_LIST::FindPreviousItem( KICAD_T aType, SCH_SHEET_PATH** aShe return NULL; } + + +bool SCH_SHEET_LIST::SetComponentFootprint( const wxString& aReference, + const wxString& aFootPrint, bool aSetVisible ) +{ + bool found = false; + + for( SCH_SHEET_PATH* path = GetFirst(); path; path = GetNext() ) + found = path->SetComponentFootprint( aReference, aFootPrint, aSetVisible ); + + return found; +} + + +bool SCH_SHEET_LIST::IsComplexHierarchy() const +{ + wxString fileName; + + for( int i = 0; i < m_count; i++ ) + { + fileName = m_list[i].Last()->GetFileName(); + + for( int j = 0; j < m_count; j++ ) + { + if( i == j ) + continue; + + if( fileName == m_list[j].Last()->GetFileName() ) + return true; + } + } + + return false; +} + + +bool SCH_SHEET_LIST::TestForRecursion( const SCH_SHEET_LIST& aSrcSheetHierarchy, + const wxString& aDestFileName ) const +{ + wxFileName rootFn = g_RootSheet->GetFileName(); + wxFileName destFn = aDestFileName; + + if( destFn.IsRelative() ) + destFn.MakeAbsolute( rootFn.GetPath() ); + + // Test each SCH_SHEET_PATH in this SCH_SHEET_LIST for potential recursion. + for( int i = 0; i < m_count; i++ ) + { + // Test each SCH_SHEET_PATH in the source sheet. + for( int j = 0; j < aSrcSheetHierarchy.GetCount(); j++ ) + { + SCH_SHEET_PATH* sheetPath = aSrcSheetHierarchy.GetSheet( j ); + + for( unsigned k = 0; k < sheetPath->GetCount(); k++ ) + { + if( m_list[i].TestForRecursion( sheetPath->GetSheet( k )->GetFileName(), + aDestFileName ) ) + return true; + } + } + } + + // The source sheet file can safely be added to the destination sheet file. + return false; +} + + +SCH_SHEET* SCH_SHEET_LIST::FindSheetByName( const wxString& aSheetName ) +{ + for( int i = 0; i < m_count; i++ ) + { + SCH_SHEET* sheet = m_list[i].FindSheetByName( aSheetName ); + + if( sheet ) + return sheet; + } + + return NULL; +} diff --git a/eeschema/sch_sheet_path.h b/eeschema/sch_sheet_path.h index a1de4fb89c..c301e030bd 100644 --- a/eeschema/sch_sheet_path.h +++ b/eeschema/sch_sheet_path.h @@ -1,10 +1,9 @@ - /* * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2009 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com - * Copyright (C) 2011-2015 Wayne Stambaugh - * Copyright (C) 1992-2015 KiCad Developers, see AUTHORS.txt for contributors. + * Copyright (C) 2011 Wayne Stambaugh + * Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -80,13 +79,21 @@ class wxFindReplaceData; class SCH_SCREEN; +class SCH_MARKER; class SCH_SHEET; class SCH_ITEM; - +class SCH_REFERENCE_LIST; +class PART_LIBS; #define SHEET_NOT_FOUND -1 +/** + * Type SCH_MULTI_UNIT_REFERENCE_MAP + * is used to create a map of reference designators for multi-unit parts. + */ +typedef std::map SCH_MULTI_UNIT_REFERENCE_MAP; + /** * Class SCH_SHEET_PATH * handles access to a sheet by way of a path. @@ -208,6 +215,75 @@ public: */ bool BuildSheetPathInfoFromSheetPathValue( const wxString& aPath, bool aFound = false ); + /** + * Function UpdateAllScreenReferences + * updates the reference and the m_Multi parameter (part selection) for all + * components on a screen depending on the actual sheet path. + * Mandatory in complex hierarchies because sheets use the same screen + * (basic schematic) + * but with different references and part selections according to the + * displayed sheet + */ + void UpdateAllScreenReferences(); + + /** + * Function AnnotatePowerSymbols + * annotates the power symbols only starting at \a aReference in the sheet path. + * @param aLibs the library list to use + * @param aReference A pointer to the number for the reference designator of the + * first power symbol to be annotated. If the pointer is NULL + * the annotation starts at 1. The number is incremented for + * each power symbol annotated. + */ + void AnnotatePowerSymbols( PART_LIBS* aLibs, int* aReference ); + + /** + * Function GetComponents + * adds a SCH_REFERENCE() object to \a aReferences for each component in the sheet. + * @param aLibs the library list to use + * @param aReferences List of references to populate. + * @param aIncludePowerSymbols : false to only get normal components. + */ + void GetComponents( PART_LIBS* aLibs, SCH_REFERENCE_LIST& aReferences, + bool aIncludePowerSymbols = true ); + + /** + * Function GetMultiUnitComponents + * adds a SCH_REFERENCE_LIST object to \a aRefList for each same-reference set of + * multi-unit parts in the sheet. The map key for each element will be the + * reference designator. + * @param aLibs the library list to use + * @param aRefList Map of reference designators to reference lists + * @param aIncludePowerSymbols : false to only get normal components. + */ + void GetMultiUnitComponents( PART_LIBS* aLibs, SCH_MULTI_UNIT_REFERENCE_MAP &aRefList, + bool aIncludePowerSymbols = true ); + + /** + * Function SetFootprintField + * searches last sheet in the path for a component with \a aReference and set the footprint + * field to \a aFootPrint if found. + * + * @param aReference The reference designator of the component. + * @param aFootPrint The value to set the footprint field. + * @param aSetVisible The value to set the field visibility flag. + * @return True if \a aReference was found otherwise false. + */ + bool SetComponentFootprint( const wxString& aReference, const wxString& aFootPrint, + bool aSetVisible ); + + /** + * Find the next schematic item in this sheet object. + * + * @param aType - The type of schematic item object to search for. + * @param aLastItem - Start search from aLastItem. If no aLastItem, search from + * the beginning of the list. + * @param aWrap - Wrap around the end of the list to find the next item if aLastItem + * is defined. + * @return - The next schematic item if found. Otherwise, NULL is returned. + */ + SCH_ITEM* FindNextItem( KICAD_T aType, SCH_ITEM* aLastItem = NULL, bool aWrap = false ) const; + /** * Find the previous schematic item in this sheet path object. * @@ -220,6 +296,31 @@ public: */ SCH_ITEM* FindPreviousItem( KICAD_T aType, SCH_ITEM* aLastItem = NULL, bool aWrap = false ) const; + /** + * Function TestForRecursion + * + * test the SCH_SHEET_PATH file names to check adding the sheet stored in the file + * \a aSrcFileName to the sheet stored in file \a aDestFileName will cause a sheet + * path recursion. + * + * @param aSrcFileName is the source file name of the sheet add to \a aDestFileName. + * @param aDestFileName is the file name of the destination sheet for \a aSrcFileName. + * @return true if \a aFileName will cause recursion in the sheet path. Otherwise false. + */ + bool TestForRecursion( const wxString& aSrcFileName, const wxString& aDestFileName ) const; + + int FindSheet( const wxString& aFileName ) const; + + /** + * Function FindSheetByName + * + * searches the #SCH_SHEET_PATH for a sheet named \a aSheetName. + * + * @param aSheetName is the name of the sheet to find. + * @return a pointer to the sheet named \a aSheetName if found or NULL if not found. + */ + SCH_SHEET* FindSheetByName( const wxString& aSheetName ); + SCH_SHEET_PATH& operator=( const SCH_SHEET_PATH& d1 ); bool operator==( const SCH_SHEET_PATH& d1 ) const; @@ -335,6 +436,51 @@ public: */ SCH_SHEET_PATH* GetSheetByPath( const wxString aPath, bool aHumanReadable = true ); + /** + * Function IsModified + * checks the entire hierarchy for any modifications. + * @returns True if the hierarchy is modified otherwise false. + */ + bool IsModified(); + + /** + * Function IsAutoSaveRequired + * checks the entire hierarchy for any modifications that require auto save. + * @return True if the hierarchy is modified otherwise false. + */ + bool IsAutoSaveRequired(); + + void ClearModifyStatus(); + + /** + * Function AnnotatePowerSymbols + * clear and annotates the entire hierarchy of the sheet path list. + * @param aLib the library list to use + */ + void AnnotatePowerSymbols( PART_LIBS* aLib ); + + /** + * Function GetComponents + * adds a SCH_REFERENCE() object to \a aReferences for each component in the list + * of sheets. + * @param aLibs the library list to use + * @param aReferences List of references to populate. + * @param aIncludePowerSymbols Set to false to only get normal components. + */ + void GetComponents( PART_LIBS* aLibs, SCH_REFERENCE_LIST& aReferences, bool aIncludePowerSymbols = true ); + + /** + * Function GetMultiUnitComponents + * adds a SCH_REFERENCE_LIST object to \a aRefList for each same-reference set of + * multi-unit parts in the list of sheets. The map key for each element will be the + * reference designator. + * @param aLibs the library list to use + * @param aRefList Map of reference designators to reference lists + * @param aIncludePowerSymbols Set to false to only get normal components. + */ + void GetMultiUnitComponents( PART_LIBS* aLibs, SCH_MULTI_UNIT_REFERENCE_MAP &aRefList, + bool aIncludePowerSymbols = true ); + /** * Function FindNextItem * searches the entire schematic for the next schematic object. @@ -363,6 +509,51 @@ public: SCH_ITEM* FindPreviousItem( KICAD_T aType, SCH_SHEET_PATH** aSheetFound = NULL, SCH_ITEM* aLastItem = NULL, bool aWrap = true ); + /** + * Function SetFootprintField + * searches all the sheets for a component with \a aReference and set the footprint + * field to \a aFootPrint if found. + * + * @param aReference The reference designator of the component. + * @param aFootPrint The value to set the footprint field. + * @param aSetVisible The value to set the field visibility flag. + * @return True if \a aReference was found otherwise false. + */ + bool SetComponentFootprint( const wxString& aReference, const wxString& aFootPrint, + bool aSetVisible ); + + /** + * Function IsComplexHierarchy + * searches all of the sheets for duplicate files names which indicates a complex + * hierarchy. + * + * @return true if the #SCH_SHEET_LIST is a complex hierarchy. + */ + bool IsComplexHierarchy() const; + + /** + * Function TestForRecursion + * + * test every SCH_SHEET_PATH in the SCH_SHEET_LIST to verify if adding the sheets stored + * in \a aSrcSheetHierarchy to the sheet stored in \a aDestFileName will cause recursion. + * + * @param aSrcSheetHierarchy is the SCH_SHEET_LIST of the source sheet add to \a aDestFileName. + * @param aDestFileName is the file name of the destination sheet for \a aSrcFileName. + * @return true if \a aFileName will cause recursion in the sheet path. Otherwise false. + */ + bool TestForRecursion( const SCH_SHEET_LIST& aSrcSheetHierarchy, + const wxString& aDestFileName ) const; + + /** + * Function FindSheetByName + * + * searches the entire #SCH_SHEET_LIST for a sheet named \a aSheetName. + * + * @param aSheetName is the name of the sheet to find. + * @return a pointer to the sheet named \a aSheetName if found or NULL if not found. + */ + SCH_SHEET* FindSheetByName( const wxString& aSheetName ); + private: /** diff --git a/eeschema/schedit.cpp b/eeschema/schedit.cpp index 4d46360b1a..864f8d5f61 100644 --- a/eeschema/schedit.cpp +++ b/eeschema/schedit.cpp @@ -983,7 +983,7 @@ void SCH_EDIT_FRAME::OnEditItem( wxCommandEvent& aEvent ) } case SCH_SHEET_T: - if( EditSheet( (SCH_SHEET*) item, m_CurrentSheet->Last() ) ) + if( EditSheet( (SCH_SHEET*) item, m_CurrentSheet ) ) m_canvas->Refresh(); break; diff --git a/eeschema/schframe.cpp b/eeschema/schframe.cpp index 3911f0c468..d545a37a44 100644 --- a/eeschema/schframe.cpp +++ b/eeschema/schframe.cpp @@ -2,7 +2,7 @@ * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr - * Copyright (C) 1992-2015 KiCad Developers, see AUTHORS.txt for contributors. + * Copyright (C) 1992-2013 KiCad Developers, see AUTHORS.txt for contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -523,8 +523,6 @@ void SCH_EDIT_FRAME::CreateScreens() if( g_RootSheet == NULL ) { g_RootSheet = new SCH_SHEET(); - g_RootSheet->SetName( "root" ); - g_RootSheet->SetFileName( "noname.sch" ); } if( g_RootSheet->GetScreen() == NULL ) @@ -616,7 +614,9 @@ void SCH_EDIT_FRAME::OnCloseWindow( wxCloseEvent& aEvent ) return; } - if( g_RootSheet->IsModified() ) + SCH_SHEET_LIST sheetList; + + if( sheetList.IsModified() ) { wxString fileName = Prj().AbsolutePath( g_RootSheet->GetScreen()->GetFileName() ); wxString msg = wxString::Format( _( @@ -667,7 +667,7 @@ void SCH_EDIT_FRAME::OnCloseWindow( wxCloseEvent& aEvent ) wxRemoveFile( fn.GetFullPath() ); } - g_RootSheet->ClearModifyStatus(); + sheetList.ClearModifyStatus(); wxString fileName = Prj().AbsolutePath( g_RootSheet->GetScreen()->GetFileName() ); @@ -787,13 +787,16 @@ void SCH_EDIT_FRAME::OnUpdateHiddenPins( wxUpdateUIEvent& aEvent ) void SCH_EDIT_FRAME::OnUpdateSave( wxUpdateUIEvent& aEvent ) { - aEvent.Enable( g_RootSheet->IsModified() ); + SCH_SHEET_LIST sheetList; + + aEvent.Enable( sheetList.IsModified() ); } void SCH_EDIT_FRAME::OnUpdateSaveSheet( wxUpdateUIEvent& aEvent ) { aEvent.Enable( GetScreen()->IsModify() ); + } @@ -1226,9 +1229,12 @@ bool SCH_EDIT_FRAME::isAutoSaveRequired() const { // In case this event happens before g_RootSheet is initialized which does happen // on mingw64 builds. + if( g_RootSheet != NULL ) { - return g_RootSheet->IsAutoSaveRequired(); + SCH_SHEET_LIST sheetList; + + return sheetList.IsAutoSaveRequired(); } return false; @@ -1274,7 +1280,7 @@ void SCH_EDIT_FRAME::addCurrentItemToList( bool aRedraw ) // the m_mouseCaptureCallback function. m_canvas->SetMouseCapture( NULL, NULL ); - if( !EditSheet( (SCH_SHEET*)item, m_CurrentSheet->Last() ) ) + if( !EditSheet( (SCH_SHEET*)item, m_CurrentSheet ) ) { screen->SetCurItem( NULL ); delete item; diff --git a/eeschema/schframe.h b/eeschema/schframe.h index fe9fd529cc..23a9bb0581 100644 --- a/eeschema/schframe.h +++ b/eeschema/schframe.h @@ -1015,7 +1015,7 @@ public: * * Note: the screen is not refresh. The caller is responsible to do that */ - bool EditSheet( SCH_SHEET* aSheet, SCH_SHEET* aHierarchy ); + bool EditSheet( SCH_SHEET* aSheet, SCH_SHEET_PATH* aHierarchy ); wxPoint GetLastSheetPinPosition() const { return m_lastSheetPinPosition; } diff --git a/eeschema/sheet.cpp b/eeschema/sheet.cpp index bd1c935759..95005c671e 100644 --- a/eeschema/sheet.cpp +++ b/eeschema/sheet.cpp @@ -41,7 +41,7 @@ #include -bool SCH_EDIT_FRAME::EditSheet( SCH_SHEET* aSheet, SCH_SHEET* aHierarchy ) +bool SCH_EDIT_FRAME::EditSheet( SCH_SHEET* aSheet, SCH_SHEET_PATH* aHierarchy ) { if( aSheet == NULL || aHierarchy == NULL ) return false; @@ -86,7 +86,7 @@ bool SCH_EDIT_FRAME::EditSheet( SCH_SHEET* aSheet, SCH_SHEET* aHierarchy ) } // Duplicate sheet names are not valid. - const SCH_SHEET* sheet = g_RootSheet->FindSheetByName( dlg.GetSheetName() ); + const SCH_SHEET* sheet = hierarchy.FindSheetByName( dlg.GetSheetName() ); if( sheet && (sheet != aSheet) ) { @@ -235,16 +235,15 @@ bool SCH_EDIT_FRAME::EditSheet( SCH_SHEET* aSheet, SCH_SHEET* aHierarchy ) (long unsigned) aSheet->GetTimeStamp() ) ); // Make sure the sheet changes do not cause any recursion. - std::vector< std::vector< const SCH_SHEET* > > sheetHierarchy; - aSheet->GetSheetPaths( sheetHierarchy ); + SCH_SHEET_LIST sheetHierarchy( aSheet ); // Make sure files have fully qualified path and file name. - wxFileName destFn = aHierarchy->GetFileName(); + wxFileName destFn = aHierarchy->Last()->GetFileName(); if( destFn.IsRelative() ) destFn.MakeAbsolute( Prj().GetProjectPath() ); - if( g_RootSheet->TestForRecursion( sheetHierarchy, destFn.GetFullPath( wxPATH_UNIX ) ) ) + if( hierarchy.TestForRecursion( sheetHierarchy, destFn.GetFullPath( wxPATH_UNIX ) ) ) { msg.Printf( _( "The sheet changes cannot be made because the destination sheet already " "has the sheet <%s> or one of it's subsheets as a parent somewhere in " @@ -358,7 +357,7 @@ SCH_SHEET* SCH_EDIT_FRAME::CreateSheet( wxDC* aDC ) sheet->SetFlags( IS_NEW | IS_RESIZED ); sheet->SetTimeStamp( GetNewTimeStamp() ); - sheet->SetParent( GetCurrentSheet().Last() ); + sheet->SetParent( GetScreen() ); sheet->SetScreen( NULL ); // need to check if this is being added to the GetDrawItems(). diff --git a/gerbview/rs274d.cpp b/gerbview/rs274d.cpp index 3d8ec5473b..1d35338833 100644 --- a/gerbview/rs274d.cpp +++ b/gerbview/rs274d.cpp @@ -548,6 +548,7 @@ bool GERBER_IMAGE::Execute_G_Command( char*& text, int G_command ) case GC_TURN_ON_POLY_FILL: m_PolygonFillMode = true; + m_Exposure = false; break; case GC_TURN_OFF_POLY_FILL: @@ -617,7 +618,7 @@ bool GERBER_IMAGE::Execute_DCODE_Command( char*& text, int D_commande ) switch( D_commande ) { case 1: // code D01 Draw line, exposure ON - if( !m_Exposure ) + if( !m_Exposure ) // Start a new polygon outline: { m_Exposure = true; gbritem = new GERBER_DRAW_ITEM( layout, this ); diff --git a/pcbnew/pcad2kicadpcb_plugin/s_expr_loader.cpp b/pcbnew/pcad2kicadpcb_plugin/s_expr_loader.cpp index 49e966384b..19ec21db8a 100644 --- a/pcbnew/pcad2kicadpcb_plugin/s_expr_loader.cpp +++ b/pcbnew/pcad2kicadpcb_plugin/s_expr_loader.cpp @@ -51,7 +51,8 @@ void LoadInputFile( wxString aFileName, wxXmlDocument* aXmlDoc ) // check file format if( !fgets( line, sizeof( line ), fp ) - || strcmp( line, ACCEL_ASCII_KEYWORD ) ) + // first line starts with "ACCEL_ASCII" with optional stuff on same line after that. + || memcmp( line, ACCEL_ASCII_KEYWORD, sizeof(ACCEL_ASCII_KEYWORD)-1 ) ) THROW_IO_ERROR( "Unknown file type" ); // rewind the file diff --git a/pcbnew/scripting/plugins/HelpfulFootprintWizardPlugin.py b/pcbnew/scripting/plugins/HelpfulFootprintWizardPlugin.py index 90d2498f39..6c4c54e125 100644 --- a/pcbnew/scripting/plugins/HelpfulFootprintWizardPlugin.py +++ b/pcbnew/scripting/plugins/HelpfulFootprintWizardPlugin.py @@ -248,7 +248,7 @@ class HelpfulFootprintWizardPlugin(pcbnew.FootprintWizardPlugin, def GetValue(self): raise NotImplementedError - # this value come from our KiCad Library Convention 0.11 + # this value come from our KiCad Library Convention 1.0 def GetReferencePrefix(self): return "REF" @@ -259,7 +259,7 @@ class HelpfulFootprintWizardPlugin(pcbnew.FootprintWizardPlugin, """ IPC nominal """ - return pcbnew.FromMM(1.2) + return pcbnew.FromMM(1.0) def GetTextThickness(self): """ diff --git a/pcbnew/scripting/plugins/sdip_wizard.py b/pcbnew/scripting/plugins/sdip_wizard.py index 078d3158a0..12e308252e 100644 --- a/pcbnew/scripting/plugins/sdip_wizard.py +++ b/pcbnew/scripting/plugins/sdip_wizard.py @@ -37,7 +37,7 @@ class RowedGridArray(PA.PadGridArray): class RowedFootprint(HFPW.HelpfulFootprintWizardPlugin): - pad_count_key = 'pas count' + pad_count_key = 'pad count' row_count_key = 'row count' row_spacing_key = 'row spacing' pad_length_key = 'pad length' @@ -114,7 +114,7 @@ class RowedFootprint(HFPW.HelpfulFootprintWizardPlugin): self.draw.Box(0, 0, sizex, sizey) # restore line thickness to previous value self.draw.SetLineThickness(pcbnew.FromMM(cmargin)) - + #reference and value text_size = self.GetTextSize() # IPC nominal diff --git a/pcbnew/specctra_export.cpp b/pcbnew/specctra_export.cpp index 7b760b4ae2..911a23c831 100644 --- a/pcbnew/specctra_export.cpp +++ b/pcbnew/specctra_export.cpp @@ -289,7 +289,7 @@ static DRAWSEGMENT* findPoint( const wxPoint& aPoint, ::PCB_TYPE_COLLECTOR* item DRAWSEGMENT* graphic = (DRAWSEGMENT*) (*items)[i]; unsigned d; - wxASSERT( graphic->Type() == PCB_LINE_T ); + wxASSERT( graphic->Type() == PCB_LINE_T || graphic->Type() == PCB_MODULE_EDGE_T ); switch( graphic->GetShape() ) { @@ -348,7 +348,7 @@ static DRAWSEGMENT* findPoint( const wxPoint& aPoint, ::PCB_TYPE_COLLECTOR* item #if defined(DEBUG) if( items->GetCount() ) { - printf( "Unable to find segment matching point (%.6g,%.6g) (seg count %d)\n", + printf( "Unable to find segment matching point (%.6g;%.6g) (seg count %d)\n", IU2um( aPoint.x )/1000, IU2um( aPoint.y )/1000, items->GetCount()); @@ -356,13 +356,22 @@ static DRAWSEGMENT* findPoint( const wxPoint& aPoint, ::PCB_TYPE_COLLECTOR* item { DRAWSEGMENT* graphic = (DRAWSEGMENT*) (*items)[i]; - printf( "item %d, type=%s, start=%.6g %.6g end=%.6g,%.6g\n", - i + 1, - TO_UTF8( BOARD_ITEM::ShowShape( graphic->GetShape() ) ), - IU2um( graphic->GetStart().x )/1000, - IU2um( graphic->GetStart().y )/1000, - IU2um( graphic->GetEnd().x )/1000, - IU2um( graphic->GetEnd().y )/1000 ); + if( graphic->GetShape() == S_ARC ) + printf( "item %d, type=%s, start=%.6g;%.6g end=%.6g;%.6g\n", + i + 1, + TO_UTF8( BOARD_ITEM::ShowShape( graphic->GetShape() ) ), + IU2um( graphic->GetArcStart().x )/1000, + IU2um( graphic->GetArcStart().y )/1000, + IU2um( graphic->GetArcEnd().x )/1000, + IU2um( graphic->GetArcEnd().y )/1000 ); + else + printf( "item %d, type=%s, start=%.6g;%.6g end=%.6g;%.6g\n", + i + 1, + TO_UTF8( BOARD_ITEM::ShowShape( graphic->GetShape() ) ), + IU2um( graphic->GetStart().x )/1000, + IU2um( graphic->GetStart().y )/1000, + IU2um( graphic->GetEnd().x )/1000, + IU2um( graphic->GetEnd().y )/1000 ); } } #endif