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
"
*/
- 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