Upstream merge.
This commit is contained in:
commit
36f1147da1
|
@ -1,11 +1,13 @@
|
|||
include/boost
|
||||
downloads-by-cmake
|
||||
.downloads-by-cmake
|
||||
common/netlist_keywords.*
|
||||
common/netlist_lexer.h
|
||||
common/pcb_plot_params_lexer.h
|
||||
common/page_layout_reader_keywords.cpp
|
||||
common/fp_lib_table_keywords.*
|
||||
include/fp_lib_table_lexer.h
|
||||
include/netlist_lexer.h
|
||||
include/page_layout_reader_lexer.h
|
||||
eeschema/cmp_library_lexer.h
|
||||
eeschema/cmp_library_keywords.*
|
||||
eeschema/template_fieldnames_keywords.*
|
||||
|
|
|
@ -74,6 +74,13 @@ else()
|
|||
message("Build testing (unstable) version of KiCad")
|
||||
endif()
|
||||
|
||||
# All CMake downloads go here. Suggested is up in the source tree, not in the build dir where they
|
||||
# would have to be downloaded over and over again. The default is to choose a directory that is
|
||||
# hidden on linux (starts with a '.') because there is a way to exclude this directory when grepping
|
||||
# the source tree.
|
||||
set( DOWNLOAD_DIR ${PROJECT_SOURCE_DIR}/.downloads-by-cmake
|
||||
CACHE PATH "Location of KiCad downloads, suggested is a dir common to all builds, i.e. global." )
|
||||
|
||||
|
||||
#================================================
|
||||
# Set flags for GCC.
|
||||
|
@ -149,6 +156,11 @@ if(CMAKE_COMPILER_IS_GNUCXX)
|
|||
set(CMAKE_CXX_FLAGS_DEBUG "${KICAD_GCC_DEBUG_BUILD_FLAGS} -Wall -g3 -ggdb3 -DDEBUG")
|
||||
endif()
|
||||
|
||||
# quiet GCC 4.8.1 while in boost
|
||||
if( GCC_VERSION VERSION_GREATER 4.8 OR GCC_VERSION VERSION_EQUAL 4.8 )
|
||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-local-typedefs" )
|
||||
endif()
|
||||
|
||||
endif(CMAKE_COMPILER_IS_GNUCXX)
|
||||
|
||||
if(wxUSE_UNICODE)
|
||||
|
@ -239,10 +251,6 @@ include(Functions)
|
|||
|
||||
include( ExternalProject )
|
||||
|
||||
# All CMake downloads go here, up in the source tree, not in the build dir where they
|
||||
# would have to be downloaded over and over again.
|
||||
set( DOWNLOAD_DIR ${PROJECT_SOURCE_DIR}/downloads-by-cmake )
|
||||
|
||||
#================================================
|
||||
# Find libraries that are needed to build KiCad.
|
||||
#================================================
|
||||
|
|
|
@ -8,5 +8,6 @@ file( STRINGS ${inputFile} lines )
|
|||
file( WRITE ${outputFile} "// Do not edit this file, it is autogenerated by CMake from an HTML file\n" )
|
||||
|
||||
foreach( line ${lines} )
|
||||
file( APPEND ${outputFile} "\"" ${line} "\"\n" )
|
||||
STRING(REGEX REPLACE "\"" "\\\\\"" linem ${line})
|
||||
file( APPEND ${outputFile} "\"" ${linem} "\\n\"\n" )
|
||||
endforeach( line ${lines} )
|
||||
|
|
|
@ -1,21 +1,22 @@
|
|||
IF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
|
||||
MESSAGE(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"")
|
||||
ENDIF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
|
||||
if( NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" )
|
||||
message( FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"" )
|
||||
endif()
|
||||
|
||||
FILE(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files)
|
||||
STRING(REGEX REPLACE "\n" ";" files "${files}")
|
||||
FOREACH(file ${files})
|
||||
MESSAGE(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"")
|
||||
IF(EXISTS "$ENV{DESTDIR}${file}")
|
||||
EXEC_PROGRAM(
|
||||
"@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\""
|
||||
OUTPUT_VARIABLE rm_out
|
||||
RETURN_VALUE rm_retval
|
||||
)
|
||||
IF(NOT "${rm_retval}" STREQUAL 0)
|
||||
MESSAGE(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"")
|
||||
ENDIF(NOT "${rm_retval}" STREQUAL 0)
|
||||
ELSE(EXISTS "$ENV{DESTDIR}${file}")
|
||||
MESSAGE(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.")
|
||||
ENDIF(EXISTS "$ENV{DESTDIR}${file}")
|
||||
ENDFOREACH(file)
|
||||
file( READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files )
|
||||
string( REGEX REPLACE "\n" ";" files "${files}" )
|
||||
|
||||
foreach( file ${files} )
|
||||
message( STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"" )
|
||||
if( EXISTS "$ENV{DESTDIR}${file}" )
|
||||
EXEC_PROGRAM(
|
||||
"@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\""
|
||||
OUTPUT_VARIABLE rm_out
|
||||
RETURN_VALUE rm_retval
|
||||
)
|
||||
if( NOT "${rm_retval}" STREQUAL 0 )
|
||||
message( FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"" )
|
||||
endif()
|
||||
else()
|
||||
message( STATUS "File \"$ENV{DESTDIR}${file}\" does not exist." )
|
||||
endif()
|
||||
endforeach()
|
||||
|
|
|
@ -28,16 +28,22 @@ development libaries.
|
|||
After a fresh install you need the following packages to compile and run
|
||||
KiCad from source.
|
||||
|
||||
CMake - Cross-platform make
|
||||
GLUT - The OpenGL Utility Library
|
||||
wxGTK or wxWidgets - The wxWidgets GUI toolkit with GTK+ bindings
|
||||
* bzr - Bazaar version control system
|
||||
* CMake - Cross-platform make
|
||||
* GLUT - The OpenGL Utility Library
|
||||
* wxGTK or wxWidgets - The wxWidgets GUI toolkit with GTK+ bindings
|
||||
|
||||
Boost - Collection of portable C++ source libraries
|
||||
Because boost is in the repository of kicad you don't need to install them.
|
||||
* Boost - Collection of portable C++ source libraries
|
||||
boost will be automagically downloaded and copied in kicad sources tree,
|
||||
the first time you compile kicad.
|
||||
|
||||
Useful, but not required:
|
||||
Doxygen - Documentation system for several programming languages
|
||||
* Doxygen - Documentation system for several programming languages
|
||||
|
||||
KiCad uses the Bazaar version control system to track source code changes,
|
||||
and download the boost libraries needed by Kicad.
|
||||
Be sure you bzr install also includes bzrtools.
|
||||
boost libraries will be downloaded the first time you build Kicad.
|
||||
|
||||
Compiler and basic development tools
|
||||
-------------
|
||||
|
|
|
@ -1,3 +1,17 @@
|
|||
Bazaar
|
||||
------
|
||||
KiCad uses the Bazaar version control system to track source code changes,
|
||||
and download the boost libraries needed by Kicad.
|
||||
The easiest way to get a copy of the KiCad source is to use Bazaar.
|
||||
Bazaar can be download from http://wiki.bazaar.canonical.com.
|
||||
Your best bet is to use the stand alone version of Bazaar
|
||||
(which includes bzrtools, needed by Kicad) rather than one of
|
||||
the Python specific versions.
|
||||
Be sure bzrtools is also installed.
|
||||
boost libraries will be downloaded the first time you build Kicad.
|
||||
|
||||
CMake
|
||||
-----
|
||||
KiCad uses CMake to generate the build files specific for the target platform
|
||||
specified by the developer. This document attempts to define some of the more
|
||||
common CMake and KiCad build configuration settings. You can use CMake either
|
||||
|
|
|
@ -26,10 +26,12 @@ languages. Only C is installed by default and C++ is required to build KiCad.
|
|||
|
||||
Bazaar
|
||||
------
|
||||
KiCad uses the Bazaar version control system to track source code changes.
|
||||
KiCad uses the Bazaar version control system to track source code changes,
|
||||
and download the boost libraries needed by Kicad.
|
||||
The easiest way to get a copy of the KiCad source is to use Bazaar. Bazaar
|
||||
can be download from http://http://wiki.bazaar.canonical.com/WindowsDownloads.
|
||||
Your best bet is to use the stand alone version of Bazaar rather than one of
|
||||
can be download from http://wiki.bazaar.canonical.com/WindowsDownloads.
|
||||
Your best bet is to use the stand alone version of Bazaar
|
||||
(which includes bzrtools, needed Kicad) rather than one of
|
||||
the Python specific versions.
|
||||
|
||||
CMake
|
||||
|
@ -87,7 +89,7 @@ MinGW linker.
|
|||
Build and Install the wxWidgets Library
|
||||
---------------------------------------
|
||||
The wxWidgets library is the base that KiCad is built upon. Version 2.9.4
|
||||
or later of wxWidgets should be used on Windows. You may be able to build
|
||||
or later of wxWidgets *should be* used on Windows. You may be able to build
|
||||
KiCad with older versions of wxWidgets but it is not recommended. wxWidgets
|
||||
can be downloaded from http://http://www.wxwidgets.org/downloads/
|
||||
|
||||
|
@ -107,16 +109,10 @@ install the wxWidgets library into MinGW then enter the following commands:
|
|||
If you want to install wxWidgets in MinGW then enter the following commands:
|
||||
#mkdir Release
|
||||
#cd Release
|
||||
#../configure --prefix=/mingw --with-opengl
|
||||
#../configure --prefix=/mingw --enable-monolithic=no --disable-shared --with-opengl
|
||||
#make && make install
|
||||
#move /mingw/lib/wxmsw*.dll /mingw/bin
|
||||
|
||||
The last command is critical so that the libraries are in the MinGW PATH
|
||||
and can be found at run time. If you want to build a full debugging version
|
||||
of wxWidgets, add --enable-debug to the configure command. If you are going
|
||||
to use the GNU debugger, you may also want to build the debugging libraries
|
||||
with the extra GDB debugging information by adding --enable-debug_gdb to the
|
||||
configure command.
|
||||
wxWidgets will be statically linked to Kicad, which avoid issus with wxWidgets dlls
|
||||
|
||||
Download the KiCad Source Code
|
||||
------------------------------
|
||||
|
@ -229,5 +225,5 @@ To build the HTML developer documentation, run the following commands:
|
|||
#cd <kicadSource>/build/debug
|
||||
#make doxygen-docs
|
||||
|
||||
The documentation will be created in the <kicadSouce>/Documenation/html
|
||||
The documentation will be created in the <kicadSouce>/Documentation/html
|
||||
directory.
|
||||
|
|
|
@ -9,6 +9,7 @@ Snow Leopard
|
|||
|
||||
Requirements
|
||||
* XCode Tools (http://developer.apple.com/tools/xcode)
|
||||
* bzr (bazaar)
|
||||
* CMake (http://www.cmake.org)
|
||||
* wxWidgets 2.9 (http://www.wxwidgets.org/downloads)
|
||||
* Doxygen (http://www.doxygen.nl)
|
||||
|
@ -19,7 +20,7 @@ Building wxWidgets 2.9 Universal
|
|||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
To check if your tools and libraries are installed check with file for architectures.
|
||||
|
||||
user@macosx$ file /Developer/SDKs/MacOSX10.5.sdk/usr/lib/libSystem.dylib
|
||||
user@macosx$ file /Developer/SDKs/MacOSX10.5.sdk/usr/lib/libSystem.dylib
|
||||
|
||||
/Developer/SDKs/MacOSX10.5.sdk/usr/lib/libSystem.dylib: Mach-O universal binary with 4 architectures
|
||||
/Developer/SDKs/MacOSX10.5.sdk/usr/lib/libSystem.dylib (for architecture ppc7400): Mach-O dynamically linked shared library stub ppc
|
||||
|
@ -37,7 +38,7 @@ At time of writing (2009-01-16) this is on line 18381
|
|||
into this: OSX_UNIV_OPTS="-arch ppc -arch i386 -arch x86_64"
|
||||
|
||||
Building a universal monolib wxWidgets 2.9 with the following parameters:
|
||||
./configure --enable-unicode=yes --enable-shared=no --enable-monolithic --with-opengl --with-expat=builtin --enable-universal_binary --enable-aui --enable-debug --with-osx_cocoa --with-macosx-sdk=/Developer/SDKs/MacOSX10.5.sdk/ --prefix=/opt/wxwidgets/<rev>
|
||||
./configure --enable-unicode=yes --enable-shared=no --enable-monolithic --with-opengl --with-expat=builtin --enable-universal_binary --enable-aui --enable-debug --with-osx_cocoa --with-macosx-sdk=/Developer/SDKs/MacOSX10.5.sdk/ --prefix=/opt/wxwidgets/<rev>
|
||||
|
||||
<rev> Should be subsituded with the revision from SVN
|
||||
|
||||
|
@ -91,7 +92,7 @@ It depends on which CMake version you use:
|
|||
//This fixes also BOOST macro errors
|
||||
CMAKE_CXX_FLAGS:STRING=-D__ASSERTMACROS__
|
||||
|
||||
//Build architectures for OSX
|
||||
//Build architectures for OSX
|
||||
CMAKE_OSX_ARCHITECTURES:STRING=x86_64 -arch i386 -arch ppc -isysroot /Developer/SDKs/MacOSX10.5.sdk/ -mmacosx-version-min=10.5
|
||||
|
||||
//The product will be built against the headers and libraries located
|
||||
|
|
|
@ -1,530 +0,0 @@
|
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
||||
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<meta name="generator" content="AsciiDoc 8.4.5" />
|
||||
<title>KiCad 2010-xx-xx Release</title>
|
||||
<style type="text/css">
|
||||
/* Debug borders */
|
||||
p, li, dt, dd, div, pre, h1, h2, h3, h4, h5, h6 {
|
||||
/*
|
||||
border: 1px solid red;
|
||||
*/
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 1em 5% 1em 5%;
|
||||
}
|
||||
|
||||
a {
|
||||
color: blue;
|
||||
text-decoration: underline;
|
||||
}
|
||||
a:visited {
|
||||
color: fuchsia;
|
||||
}
|
||||
|
||||
em {
|
||||
font-style: italic;
|
||||
color: navy;
|
||||
}
|
||||
|
||||
strong {
|
||||
font-weight: bold;
|
||||
color: #083194;
|
||||
}
|
||||
|
||||
tt {
|
||||
color: navy;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
color: #527bbd;
|
||||
font-family: sans-serif;
|
||||
margin-top: 1.2em;
|
||||
margin-bottom: 0.5em;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
h1, h2, h3 {
|
||||
border-bottom: 2px solid silver;
|
||||
}
|
||||
h2 {
|
||||
padding-top: 0.5em;
|
||||
}
|
||||
h3 {
|
||||
float: left;
|
||||
}
|
||||
h3 + * {
|
||||
clear: left;
|
||||
}
|
||||
|
||||
div.sectionbody {
|
||||
font-family: serif;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
hr {
|
||||
border: 1px solid silver;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-top: 0.5em;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
|
||||
ul, ol, li > p {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
pre {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
span#author {
|
||||
color: #527bbd;
|
||||
font-family: sans-serif;
|
||||
font-weight: bold;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
span#email {
|
||||
}
|
||||
span#revnumber, span#revdate, span#revremark {
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
div#footer {
|
||||
font-family: sans-serif;
|
||||
font-size: small;
|
||||
border-top: 2px solid silver;
|
||||
padding-top: 0.5em;
|
||||
margin-top: 4.0em;
|
||||
}
|
||||
div#footer-text {
|
||||
float: left;
|
||||
padding-bottom: 0.5em;
|
||||
}
|
||||
div#footer-badges {
|
||||
float: right;
|
||||
padding-bottom: 0.5em;
|
||||
}
|
||||
|
||||
div#preamble {
|
||||
margin-top: 1.5em;
|
||||
margin-bottom: 1.5em;
|
||||
}
|
||||
div.tableblock, div.imageblock, div.exampleblock, div.verseblock,
|
||||
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
|
||||
div.admonitionblock {
|
||||
margin-top: 1.5em;
|
||||
margin-bottom: 1.5em;
|
||||
}
|
||||
div.admonitionblock {
|
||||
margin-top: 2.5em;
|
||||
margin-bottom: 2.5em;
|
||||
}
|
||||
|
||||
div.content { /* Block element content. */
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/* Block element titles. */
|
||||
div.title, caption.title {
|
||||
color: #527bbd;
|
||||
font-family: sans-serif;
|
||||
font-weight: bold;
|
||||
text-align: left;
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
div.title + * {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
td div.title:first-child {
|
||||
margin-top: 0.0em;
|
||||
}
|
||||
div.content div.title:first-child {
|
||||
margin-top: 0.0em;
|
||||
}
|
||||
div.content + div.title {
|
||||
margin-top: 0.0em;
|
||||
}
|
||||
|
||||
div.sidebarblock > div.content {
|
||||
background: #ffffee;
|
||||
border: 1px solid silver;
|
||||
padding: 0.5em;
|
||||
}
|
||||
|
||||
div.listingblock > div.content {
|
||||
border: 1px solid silver;
|
||||
background: #f4f4f4;
|
||||
padding: 0.5em;
|
||||
}
|
||||
|
||||
div.quoteblock {
|
||||
padding-left: 2.0em;
|
||||
margin-right: 10%;
|
||||
}
|
||||
div.quoteblock > div.attribution {
|
||||
padding-top: 0.5em;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div.verseblock {
|
||||
padding-left: 2.0em;
|
||||
margin-right: 10%;
|
||||
}
|
||||
div.verseblock > div.content {
|
||||
white-space: pre;
|
||||
}
|
||||
div.verseblock > div.attribution {
|
||||
padding-top: 0.75em;
|
||||
text-align: left;
|
||||
}
|
||||
/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
|
||||
div.verseblock + div.attribution {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
div.admonitionblock .icon {
|
||||
vertical-align: top;
|
||||
font-size: 1.1em;
|
||||
font-weight: bold;
|
||||
text-decoration: underline;
|
||||
color: #527bbd;
|
||||
padding-right: 0.5em;
|
||||
}
|
||||
div.admonitionblock td.content {
|
||||
padding-left: 0.5em;
|
||||
border-left: 2px solid silver;
|
||||
}
|
||||
|
||||
div.exampleblock > div.content {
|
||||
border-left: 2px solid silver;
|
||||
padding: 0.5em;
|
||||
}
|
||||
|
||||
div.imageblock div.content { padding-left: 0; }
|
||||
span.image img { border-style: none; }
|
||||
a.image:visited { color: white; }
|
||||
|
||||
dl {
|
||||
margin-top: 0.8em;
|
||||
margin-bottom: 0.8em;
|
||||
}
|
||||
dt {
|
||||
margin-top: 0.5em;
|
||||
margin-bottom: 0;
|
||||
font-style: normal;
|
||||
color: navy;
|
||||
}
|
||||
dd > *:first-child {
|
||||
margin-top: 0.1em;
|
||||
}
|
||||
|
||||
ul, ol {
|
||||
list-style-position: outside;
|
||||
}
|
||||
ol.arabic {
|
||||
list-style-type: decimal;
|
||||
}
|
||||
ol.loweralpha {
|
||||
list-style-type: lower-alpha;
|
||||
}
|
||||
ol.upperalpha {
|
||||
list-style-type: upper-alpha;
|
||||
}
|
||||
ol.lowerroman {
|
||||
list-style-type: lower-roman;
|
||||
}
|
||||
ol.upperroman {
|
||||
list-style-type: upper-roman;
|
||||
}
|
||||
|
||||
div.compact ul, div.compact ol,
|
||||
div.compact p, div.compact p,
|
||||
div.compact div, div.compact div {
|
||||
margin-top: 0.1em;
|
||||
margin-bottom: 0.1em;
|
||||
}
|
||||
|
||||
div.tableblock > table {
|
||||
border: 3px solid #527bbd;
|
||||
}
|
||||
thead {
|
||||
font-family: sans-serif;
|
||||
font-weight: bold;
|
||||
}
|
||||
tfoot {
|
||||
font-weight: bold;
|
||||
}
|
||||
td > div.verse {
|
||||
white-space: pre;
|
||||
}
|
||||
p.table {
|
||||
margin-top: 0;
|
||||
}
|
||||
/* Because the table frame attribute is overriden by CSS in most browsers. */
|
||||
div.tableblock > table[frame="void"] {
|
||||
border-style: none;
|
||||
}
|
||||
div.tableblock > table[frame="hsides"] {
|
||||
border-left-style: none;
|
||||
border-right-style: none;
|
||||
}
|
||||
div.tableblock > table[frame="vsides"] {
|
||||
border-top-style: none;
|
||||
border-bottom-style: none;
|
||||
}
|
||||
|
||||
|
||||
div.hdlist {
|
||||
margin-top: 0.8em;
|
||||
margin-bottom: 0.8em;
|
||||
}
|
||||
div.hdlist tr {
|
||||
padding-bottom: 15px;
|
||||
}
|
||||
dt.hdlist1.strong, td.hdlist1.strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
td.hdlist1 {
|
||||
vertical-align: top;
|
||||
font-style: normal;
|
||||
padding-right: 0.8em;
|
||||
color: navy;
|
||||
}
|
||||
td.hdlist2 {
|
||||
vertical-align: top;
|
||||
}
|
||||
div.hdlist.compact tr {
|
||||
margin: 0;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
.comment {
|
||||
background: yellow;
|
||||
}
|
||||
|
||||
@media print {
|
||||
div#footer-badges { display: none; }
|
||||
}
|
||||
|
||||
div#toctitle {
|
||||
color: #527bbd;
|
||||
font-family: sans-serif;
|
||||
font-size: 1.1em;
|
||||
font-weight: bold;
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 0.1em;
|
||||
}
|
||||
|
||||
div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
div.toclevel2 {
|
||||
margin-left: 2em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
div.toclevel3 {
|
||||
margin-left: 4em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
div.toclevel4 {
|
||||
margin-left: 6em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
/* Workarounds for IE6's broken and incomplete CSS2. */
|
||||
|
||||
div.sidebar-content {
|
||||
background: #ffffee;
|
||||
border: 1px solid silver;
|
||||
padding: 0.5em;
|
||||
}
|
||||
div.sidebar-title, div.image-title {
|
||||
color: #527bbd;
|
||||
font-family: sans-serif;
|
||||
font-weight: bold;
|
||||
margin-top: 0.0em;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
|
||||
div.listingblock div.content {
|
||||
border: 1px solid silver;
|
||||
background: #f4f4f4;
|
||||
padding: 0.5em;
|
||||
}
|
||||
|
||||
div.quoteblock-attribution {
|
||||
padding-top: 0.5em;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div.verseblock-content {
|
||||
white-space: pre;
|
||||
}
|
||||
div.verseblock-attribution {
|
||||
padding-top: 0.75em;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
div.exampleblock-content {
|
||||
border-left: 2px solid silver;
|
||||
padding-left: 0.5em;
|
||||
}
|
||||
|
||||
/* IE6 sets dynamically generated links as visited. */
|
||||
div#toc a:visited { color: blue; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="header">
|
||||
<h1>KiCad 2010-xx-xx Release</h1>
|
||||
</div>
|
||||
<h2 id="_common">Common</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="ulist"><ul>
|
||||
<li>
|
||||
<p>
|
||||
Actions can now be undo and redo
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
Menus and tooltips more clear
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
File history now in Open Recent submenu
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
Many new hotkeys added
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
Plot and print dialog rewritten
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
Remember last dialog position and tab
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
Better font shapes
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
Generation of bill of materials
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
Plot SVG output
|
||||
</p>
|
||||
</li>
|
||||
</ul></div>
|
||||
</div>
|
||||
<h2 id="_kicad">KiCad</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="ulist"><ul>
|
||||
<li>
|
||||
<p>
|
||||
Issue fixed when opening a project in a directory with a lot of subdirectories
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
If project is noname.pro no <tt>error</tt> will be displayed
|
||||
</p>
|
||||
</li>
|
||||
</ul></div>
|
||||
</div>
|
||||
<h2 id="_eeschema">EESchema</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="ulist"><ul>
|
||||
<li>
|
||||
<p>
|
||||
New pin properties dialog
|
||||
</p>
|
||||
</li>
|
||||
</ul></div>
|
||||
</div>
|
||||
<h2 id="_pcbnew">PCBNew</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="ulist"><ul>
|
||||
<li>
|
||||
<p>
|
||||
Advanced layer setup
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
New panel for layer management
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
Support for net classes
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
Incorrect DRC error fixed, DRC min via and min track check
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
Handle local mask clearance and local net clearance
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
Handle zones in connectivity calculations
|
||||
</p>
|
||||
</li>
|
||||
</ul></div>
|
||||
</div>
|
||||
<h2 id="_core">Core</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="ulist"><ul>
|
||||
<li>
|
||||
<p>
|
||||
Many many bugfixes and cleanups
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
All comments translated to English
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
Moved to wxAUI and dialogs created with wxFormBuilder
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
Full support for Mac OS X with wxWidgets 2.9
|
||||
</p>
|
||||
</li>
|
||||
</ul></div>
|
||||
</div>
|
||||
<div id="footer">
|
||||
<div id="footer-text">
|
||||
Last updated 2010-02-21 13:41:09 CEST
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -1,40 +0,0 @@
|
|||
KiCad 2010-xx-xx Release
|
||||
========================
|
||||
|
||||
== Common
|
||||
* Actions can now be undo and redo
|
||||
* Menus and tooltips more clear
|
||||
* File history now in Open Recent submenu
|
||||
* Many new hotkeys added
|
||||
* Plot and print dialog rewritten
|
||||
* Remember last dialog position and tab
|
||||
* Better font shapes
|
||||
* Generation of bill of materials
|
||||
* Plot SVG output
|
||||
|
||||
== KiCad
|
||||
* Issue fixed when opening a project in a directory with a lot of subdirectories.
|
||||
* If project is noname.pro no `error` will be displayed
|
||||
|
||||
== EESchema
|
||||
* New pin properties dialog
|
||||
|
||||
== PCBNew
|
||||
* Plot DXF output
|
||||
* Advanced layer setup
|
||||
* New panel for layer management
|
||||
* Support for net classes
|
||||
* Incorrect DRC error fixed, DRC min via and min track check
|
||||
* Handle local mask clearance and local net clearance
|
||||
* Handle zones in connectivity calculations
|
||||
|
||||
== Core
|
||||
* Many many bugfixes and cleanups
|
||||
* All comments translated to English
|
||||
* Moved to wxAUI and dialogs created with wxFormBuilder
|
||||
* Full support for Mac OS X with wxWidgets 2.9
|
||||
|
||||
///////////////////////////////////////
|
||||
This is a asciidoc formatted file, it can be converted
|
||||
to PDF,(XHTML) and others. See asciidoc homepage.
|
||||
///////////////////////////////////////
|
|
@ -2,40 +2,42 @@ Contribute to KiCad (under Linux)
|
|||
--------------------
|
||||
|
||||
1) make sure you have all the dependencies of KiCad:
|
||||
sudo apt-get install debhelper dpatch libx11-dev
|
||||
sudo apt-get install libglu1-mesa-dev libgl1-mesa-dev mesa-common-dev
|
||||
sudo apt-get install libwxbase2.8-dev libwxgtk2.8-dev libboost-dev fakeroot
|
||||
sudo apt-get install cmake bzr
|
||||
sudo apt-get install debhelper dpatch libx11-dev
|
||||
sudo apt-get install libglu1-mesa-dev libgl1-mesa-dev mesa-common-dev
|
||||
sudo apt-get install libwxbase2.8-dev libwxgtk2.8-dev libboost-dev fakeroot
|
||||
sudo apt-get install cmake bzr
|
||||
sudo apt-get install cmake bzr bzrtools
|
||||
|
||||
2) initialize Bazaar:
|
||||
bzr whoami "John Doe <john.doe@gmail.com>"
|
||||
bzr whoami "John Doe <john.doe@gmail.com>"
|
||||
|
||||
3) get LATEST KiCad source tree and name it, for instance, "kicad_john":
|
||||
cd ~/
|
||||
bzr branch lp:kicad kicad_john
|
||||
cd ~/
|
||||
bzr branch lp:kicad kicad_john
|
||||
|
||||
4) create a copy of this folder and zip it away (just in case).
|
||||
4) Read coding_style_policy.pdf, in <kicad_sources>/Documentation,
|
||||
and other docs.
|
||||
|
||||
5) Modify/add source code.
|
||||
cd kicad_john
|
||||
gedit .......
|
||||
cd kicad_john
|
||||
gedit .......
|
||||
|
||||
6) Compile:
|
||||
cd kicad_john
|
||||
mkdir build; cd build
|
||||
cmake ../ -DKICAD_TESTING_VERSION=ON -DCMAKE_BUILD_TYPE=Debug
|
||||
cd kicad_john
|
||||
mkdir build; cd build
|
||||
cmake ../ -DKICAD_TESTING_VERSION=ON -DCMAKE_BUILD_TYPE=Debug
|
||||
to build a debug version
|
||||
or
|
||||
cmake ../ -DKICAD_TESTING_VERSION=ON -DCMAKE_BUILD_TYPE=Release
|
||||
cmake ../ -DKICAD_TESTING_VERSION=ON -DCMAKE_BUILD_TYPE=Release
|
||||
to build a release version
|
||||
make -j 4 # this is for a 4 core machine
|
||||
make
|
||||
|
||||
7) Repeat step 5 and 6 until satisfied.
|
||||
|
||||
8) Create a patch:
|
||||
in kicad_john:
|
||||
in kicad_john:
|
||||
if some files are added: bzr add [FILE...]
|
||||
bzr diff > my_changes.patch
|
||||
bzr diff > my_changes.patch
|
||||
|
||||
9) Send the patch file "my_changes.patch" to the KiCad developers mailing list.
|
||||
in the subject of the e-mail include the keyword "[PATCH]".
|
||||
|
|
|
@ -46,6 +46,7 @@
|
|||
#define KEYWORD_FRAME_SIZEY wxT( "Bmconverter_Size_y" )
|
||||
#define KEYWORD_LAST_INPUT_FILE wxT( "Last_input" )
|
||||
#define KEYWORD_LAST_OUTPUT_FILE wxT( "Last_output" )
|
||||
#define KEYWORD_LAST_FORMAT wxT( "Last_format" )
|
||||
#define KEYWORD_BINARY_THRESHOLD wxT( "Threshold" )
|
||||
#define KEYWORD_BW_NEGATIVE wxT( "Negative_choice" )
|
||||
|
||||
|
@ -79,8 +80,32 @@ private:
|
|||
void OnPaint( wxPaintEvent& event );
|
||||
void OnLoadFile( wxCommandEvent& event );
|
||||
bool LoadFile( wxString& aFullFileName );
|
||||
void OnExportEeschema( wxCommandEvent& event );
|
||||
void OnExportPcbnew( wxCommandEvent& event );
|
||||
void OnExport( wxCommandEvent& event );
|
||||
|
||||
/**
|
||||
* Generate a schematic library which comtains one component:
|
||||
* the logo
|
||||
*/
|
||||
void OnExportEeschema();
|
||||
|
||||
/**
|
||||
* Depending on the option:
|
||||
* Legacy format: generate a module library which comtains one component
|
||||
* New kicad_mod format: generate a module in S expr format
|
||||
*/
|
||||
void OnExportPcbnew( bool aLegacyFormat );
|
||||
|
||||
/**
|
||||
* Generate a postscript file
|
||||
*/
|
||||
void OnExportPostScript();
|
||||
|
||||
/**
|
||||
* Generate a file suitable to be copied into a page layout
|
||||
* description file (.kicad_wks file
|
||||
*/
|
||||
void OnExportLogo();
|
||||
|
||||
void Binarize( double aThreshold ); // aThreshold = 0.0 (black level) to 1.0 (white level)
|
||||
void OnOptionsSelection( wxCommandEvent& event );
|
||||
void OnThresholdChange( wxScrollEvent& event );
|
||||
|
@ -104,6 +129,9 @@ BM2CMP_FRAME::BM2CMP_FRAME() : BM2CMP_FRAME_BASE( NULL )
|
|||
if( m_Config->Read( KEYWORD_BW_NEGATIVE, &tmp ) )
|
||||
m_rbOptions->SetSelection( tmp ? 1 : 0 );
|
||||
|
||||
m_Config->Read( KEYWORD_LAST_FORMAT, &tmp );
|
||||
m_radioBoxFormat->SetSelection( tmp );
|
||||
|
||||
|
||||
// Give an icon
|
||||
wxIcon icon;
|
||||
|
@ -114,8 +142,7 @@ BM2CMP_FRAME::BM2CMP_FRAME() : BM2CMP_FRAME_BASE( NULL )
|
|||
|
||||
SetSize( m_FramePos.x, m_FramePos.y, m_FrameSize.x, m_FrameSize.y );
|
||||
|
||||
m_buttonExportEeschema->Enable( false );
|
||||
m_buttonExportPcbnew->Enable( false );
|
||||
m_buttonExport->Enable( false );
|
||||
|
||||
if ( m_FramePos == wxDefaultPosition )
|
||||
Centre();
|
||||
|
@ -138,6 +165,7 @@ BM2CMP_FRAME::~BM2CMP_FRAME()
|
|||
m_Config->Write( KEYWORD_LAST_OUTPUT_FILE, m_ConvertedFileName );
|
||||
m_Config->Write( KEYWORD_BINARY_THRESHOLD, m_sliderThreshold->GetValue() );
|
||||
m_Config->Write( KEYWORD_BW_NEGATIVE, m_rbOptions->GetSelection() );
|
||||
m_Config->Write( KEYWORD_LAST_FORMAT, m_radioBoxFormat->GetSelection() );
|
||||
|
||||
delete m_Config;
|
||||
|
||||
|
@ -198,8 +226,7 @@ void BM2CMP_FRAME::OnLoadFile( wxCommandEvent& event )
|
|||
if( ! LoadFile( fullFilename ) )
|
||||
return;
|
||||
|
||||
m_buttonExportEeschema->Enable( true );
|
||||
m_buttonExportPcbnew->Enable( true );
|
||||
m_buttonExport->Enable( true );
|
||||
SetStatusText( fullFilename );
|
||||
Refresh();
|
||||
}
|
||||
|
@ -300,8 +327,103 @@ void BM2CMP_FRAME::OnThresholdChange( wxScrollEvent& event )
|
|||
Refresh();
|
||||
}
|
||||
|
||||
void BM2CMP_FRAME::OnExport( wxCommandEvent& event )
|
||||
{
|
||||
int sel = m_radioBoxFormat->GetSelection();
|
||||
|
||||
void BM2CMP_FRAME::OnExportEeschema( wxCommandEvent& event )
|
||||
switch( sel )
|
||||
{
|
||||
case 0:
|
||||
OnExportEeschema();
|
||||
break;
|
||||
|
||||
case 1:
|
||||
OnExportPcbnew( true );
|
||||
break;
|
||||
|
||||
case 2:
|
||||
OnExportPcbnew( false );
|
||||
break;
|
||||
|
||||
case 3:
|
||||
OnExportPostScript();
|
||||
break;
|
||||
|
||||
case 4:
|
||||
OnExportLogo();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void BM2CMP_FRAME::OnExportLogo()
|
||||
{
|
||||
wxFileName fn(m_ConvertedFileName);
|
||||
wxString path = fn.GetPath();
|
||||
|
||||
if( path.IsEmpty() || !wxDirExists(path) )
|
||||
path = ::wxGetCwd();
|
||||
|
||||
wxString msg = _( "Logo file (*.kicad_wks)|*.kicad_wks" );
|
||||
wxFileDialog FileDlg( this, _( "Create a logo file" ), path, wxEmptyString,
|
||||
msg,
|
||||
wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
|
||||
int diag = FileDlg.ShowModal();
|
||||
|
||||
if( diag != wxID_OK )
|
||||
return;
|
||||
|
||||
m_ConvertedFileName = FileDlg.GetPath();
|
||||
|
||||
FILE* outfile;
|
||||
outfile = wxFopen( m_ConvertedFileName, wxT( "w" ) );
|
||||
|
||||
if( outfile == NULL )
|
||||
{
|
||||
wxString msg;
|
||||
msg.Printf( _( "File %s could not be created" ), m_ConvertedFileName.c_str() );
|
||||
wxMessageBox( msg );
|
||||
return;
|
||||
}
|
||||
|
||||
ExportFile( outfile, 4 );
|
||||
fclose( outfile );
|
||||
}
|
||||
|
||||
void BM2CMP_FRAME::OnExportPostScript()
|
||||
{
|
||||
wxFileName fn(m_ConvertedFileName);
|
||||
wxString path = fn.GetPath();
|
||||
|
||||
if( path.IsEmpty() || !wxDirExists(path) )
|
||||
path = ::wxGetCwd();
|
||||
|
||||
wxString msg = _( "Postscript file (*.ps)|*.ps" );
|
||||
wxFileDialog FileDlg( this, _( "Create a Postscript file" ), path, wxEmptyString,
|
||||
msg,
|
||||
wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
|
||||
int diag = FileDlg.ShowModal();
|
||||
|
||||
if( diag != wxID_OK )
|
||||
return;
|
||||
|
||||
m_ConvertedFileName = FileDlg.GetPath();
|
||||
|
||||
FILE* outfile;
|
||||
outfile = wxFopen( m_ConvertedFileName, wxT( "w" ) );
|
||||
|
||||
if( outfile == NULL )
|
||||
{
|
||||
wxString msg;
|
||||
msg.Printf( _( "File %s could not be created" ), m_ConvertedFileName.c_str() );
|
||||
wxMessageBox( msg );
|
||||
return;
|
||||
}
|
||||
|
||||
ExportFile( outfile, 3 );
|
||||
fclose( outfile );
|
||||
}
|
||||
|
||||
void BM2CMP_FRAME::OnExportEeschema()
|
||||
{
|
||||
wxFileName fn(m_ConvertedFileName);
|
||||
wxString path = fn.GetPath();
|
||||
|
@ -331,12 +453,12 @@ void BM2CMP_FRAME::OnExportEeschema( wxCommandEvent& event )
|
|||
return;
|
||||
}
|
||||
|
||||
ExportFile( outfile, 1 );
|
||||
ExportFile( outfile, 2 );
|
||||
fclose( outfile );
|
||||
}
|
||||
|
||||
|
||||
void BM2CMP_FRAME::OnExportPcbnew( wxCommandEvent& event )
|
||||
void BM2CMP_FRAME::OnExportPcbnew( bool aLegacyFormat )
|
||||
{
|
||||
wxFileName fn(m_ConvertedFileName);
|
||||
wxString path = fn.GetPath();
|
||||
|
@ -344,7 +466,9 @@ void BM2CMP_FRAME::OnExportPcbnew( wxCommandEvent& event )
|
|||
if( path.IsEmpty() || !wxDirExists(path) )
|
||||
path = ::wxGetCwd();
|
||||
|
||||
wxString msg = _( "Footprint file (*.mod;*.emp)|*.mod;*.emp" );
|
||||
wxString msg = aLegacyFormat ?
|
||||
_( "Footprint file (*.emp)|*.emp" ) :
|
||||
_( "Footprint file (*.kicad_mod)|*.kicad_mod" );
|
||||
wxFileDialog FileDlg( this, _( "Create a footprint file for PcbNew" ),
|
||||
path, wxEmptyString,
|
||||
msg,
|
||||
|
@ -368,7 +492,7 @@ void BM2CMP_FRAME::OnExportPcbnew( wxCommandEvent& event )
|
|||
return;
|
||||
}
|
||||
|
||||
ExportFile( outfile, 0 );
|
||||
ExportFile( outfile, aLegacyFormat ? 0 : 1 );
|
||||
fclose( outfile );
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Sep 8 2010)
|
||||
// C++ code generated with wxFormBuilder (version Oct 8 2012)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
|
@ -47,77 +47,82 @@ BM2CMP_FRAME_BASE::BM2CMP_FRAME_BASE( wxWindow* parent, wxWindowID id, const wxS
|
|||
|
||||
m_staticTextSizeX = new wxStaticText( m_panelRight, wxID_ANY, _("Size X:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticTextSizeX->Wrap( -1 );
|
||||
fgSizerInfo->Add( m_staticTextSizeX, 0, wxALIGN_RIGHT|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
fgSizerInfo->Add( m_staticTextSizeX, 0, wxALIGN_RIGHT|wxALL|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
m_SizeXValue = new wxStaticText( m_panelRight, wxID_ANY, _("0000"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_SizeXValue->Wrap( -1 );
|
||||
fgSizerInfo->Add( m_SizeXValue, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
fgSizerInfo->Add( m_SizeXValue, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
m_SizeXunits = new wxStaticText( m_panelRight, wxID_ANY, _("pixels"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_SizeXunits->Wrap( -1 );
|
||||
fgSizerInfo->Add( m_SizeXunits, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
fgSizerInfo->Add( m_SizeXunits, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
m_staticTextSizeY = new wxStaticText( m_panelRight, wxID_ANY, _("Size Y:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticTextSizeY->Wrap( -1 );
|
||||
fgSizerInfo->Add( m_staticTextSizeY, 0, wxALIGN_RIGHT|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
fgSizerInfo->Add( m_staticTextSizeY, 0, wxALIGN_RIGHT|wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
m_SizeYValue = new wxStaticText( m_panelRight, wxID_ANY, _("0000"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_SizeYValue->Wrap( -1 );
|
||||
fgSizerInfo->Add( m_SizeYValue, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
fgSizerInfo->Add( m_SizeYValue, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
m_SizeYunits = new wxStaticText( m_panelRight, wxID_ANY, _("pixels"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_SizeYunits->Wrap( -1 );
|
||||
fgSizerInfo->Add( m_SizeYunits, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
fgSizerInfo->Add( m_SizeYunits, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
m_staticTextBPP = new wxStaticText( m_panelRight, wxID_ANY, _("BPP:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticTextBPP->Wrap( -1 );
|
||||
fgSizerInfo->Add( m_staticTextBPP, 0, wxALIGN_RIGHT|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
fgSizerInfo->Add( m_staticTextBPP, 0, wxALIGN_RIGHT|wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
m_BPPValue = new wxStaticText( m_panelRight, wxID_ANY, _("0000"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_BPPValue->Wrap( -1 );
|
||||
fgSizerInfo->Add( m_BPPValue, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
fgSizerInfo->Add( m_BPPValue, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
m_BPPunits = new wxStaticText( m_panelRight, wxID_ANY, _("bits"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_BPPunits->Wrap( -1 );
|
||||
fgSizerInfo->Add( m_BPPunits, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
fgSizerInfo->Add( m_BPPunits, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
|
||||
sbSizerInfo->Add( fgSizerInfo, 0, wxEXPAND|wxBOTTOM, 5 );
|
||||
|
||||
brightSizer->Add( sbSizerInfo, 0, wxEXPAND|wxALL, 5 );
|
||||
|
||||
brightSizer->Add( sbSizerInfo, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_buttonLoad = new wxButton( m_panelRight, wxID_ANY, _("Load Bitmap"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
brightSizer->Add( m_buttonLoad, 0, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 );
|
||||
brightSizer->Add( m_buttonLoad, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_buttonExportEeschema = new wxButton( m_panelRight, wxID_ANY, _("Export to Eeschema"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_buttonExportEeschema->SetToolTip( _("Create a library file for Eeschema\nThis library contains only one component: logo") );
|
||||
m_buttonExport = new wxButton( m_panelRight, wxID_ANY, _("Export"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_buttonExport->SetToolTip( _("Create a library file for Eeschema\nThis library contains only one component: logo") );
|
||||
|
||||
brightSizer->Add( m_buttonExportEeschema, 0, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 );
|
||||
brightSizer->Add( m_buttonExport, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_buttonExportPcbnew = new wxButton( m_panelRight, wxID_ANY, _("Export to Pcbnew"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_buttonExportPcbnew->SetToolTip( _("Create a footprint file for PcbNew\nThis footprint contains only one footprint: logo") );
|
||||
|
||||
brightSizer->Add( m_buttonExportPcbnew, 0, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 );
|
||||
wxString m_radioBoxFormatChoices[] = { _("Eeschema"), _("Pcbnew old fmt (.emp)"), _("Pcbnew kicad_mod"), _("Postscript"), _("Logo for title block") };
|
||||
int m_radioBoxFormatNChoices = sizeof( m_radioBoxFormatChoices ) / sizeof( wxString );
|
||||
m_radioBoxFormat = new wxRadioBox( m_panelRight, wxID_ANY, _("Format"), wxDefaultPosition, wxDefaultSize, m_radioBoxFormatNChoices, m_radioBoxFormatChoices, 1, wxRA_SPECIFY_COLS );
|
||||
m_radioBoxFormat->SetSelection( 4 );
|
||||
brightSizer->Add( m_radioBoxFormat, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
wxString m_rbOptionsChoices[] = { _("Normal"), _("Negative") };
|
||||
int m_rbOptionsNChoices = sizeof( m_rbOptionsChoices ) / sizeof( wxString );
|
||||
m_rbOptions = new wxRadioBox( m_panelRight, wxID_ANY, _("Options"), wxDefaultPosition, wxDefaultSize, m_rbOptionsNChoices, m_rbOptionsChoices, 1, wxRA_SPECIFY_COLS );
|
||||
m_rbOptions->SetSelection( 0 );
|
||||
brightSizer->Add( m_rbOptions, 0, wxALL|wxEXPAND, 5 );
|
||||
brightSizer->Add( m_rbOptions, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_ThresholdText = new wxStaticText( m_panelRight, wxID_ANY, _("Threshold Value:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_ThresholdText->Wrap( -1 );
|
||||
brightSizer->Add( m_ThresholdText, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||
brightSizer->Add( m_ThresholdText, 0, wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_sliderThreshold = new wxSlider( m_panelRight, wxID_ANY, 25, 0, 50, wxDefaultPosition, wxDefaultSize, wxSL_AUTOTICKS|wxSL_HORIZONTAL|wxSL_TOP );
|
||||
m_sliderThreshold = new wxSlider( m_panelRight, wxID_ANY, 50, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL|wxSL_LABELS );
|
||||
m_sliderThreshold->SetToolTip( _("Adjust the level to convert the greyscale picture to a black and white picture.") );
|
||||
|
||||
brightSizer->Add( m_sliderThreshold, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
|
||||
m_panelRight->SetSizer( brightSizer );
|
||||
m_panelRight->Layout();
|
||||
brightSizer->Fit( m_panelRight );
|
||||
bMainSizer->Add( m_panelRight, 0, wxEXPAND, 0 );
|
||||
|
||||
|
||||
this->SetSizer( bMainSizer );
|
||||
this->Layout();
|
||||
m_statusBar = this->CreateStatusBar( 1, wxST_SIZEGRIP, wxID_ANY );
|
||||
|
@ -127,8 +132,7 @@ BM2CMP_FRAME_BASE::BM2CMP_FRAME_BASE( wxWindow* parent, wxWindowID id, const wxS
|
|||
m_GreyscalePicturePanel->Connect( wxEVT_PAINT, wxPaintEventHandler( BM2CMP_FRAME_BASE::OnPaint ), NULL, this );
|
||||
m_BNPicturePanel->Connect( wxEVT_PAINT, wxPaintEventHandler( BM2CMP_FRAME_BASE::OnPaint ), NULL, this );
|
||||
m_buttonLoad->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnLoadFile ), NULL, this );
|
||||
m_buttonExportEeschema->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnExportEeschema ), NULL, this );
|
||||
m_buttonExportPcbnew->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnExportPcbnew ), NULL, this );
|
||||
m_buttonExport->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnExport ), NULL, this );
|
||||
m_rbOptions->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnOptionsSelection ), NULL, this );
|
||||
m_sliderThreshold->Connect( wxEVT_SCROLL_THUMBTRACK, wxScrollEventHandler( BM2CMP_FRAME_BASE::OnThresholdChange ), NULL, this );
|
||||
}
|
||||
|
@ -140,8 +144,7 @@ BM2CMP_FRAME_BASE::~BM2CMP_FRAME_BASE()
|
|||
m_GreyscalePicturePanel->Disconnect( wxEVT_PAINT, wxPaintEventHandler( BM2CMP_FRAME_BASE::OnPaint ), NULL, this );
|
||||
m_BNPicturePanel->Disconnect( wxEVT_PAINT, wxPaintEventHandler( BM2CMP_FRAME_BASE::OnPaint ), NULL, this );
|
||||
m_buttonLoad->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnLoadFile ), NULL, this );
|
||||
m_buttonExportEeschema->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnExportEeschema ), NULL, this );
|
||||
m_buttonExportPcbnew->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnExportPcbnew ), NULL, this );
|
||||
m_buttonExport->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnExport ), NULL, this );
|
||||
m_rbOptions->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnOptionsSelection ), NULL, this );
|
||||
m_sliderThreshold->Disconnect( wxEVT_SCROLL_THUMBTRACK, wxScrollEventHandler( BM2CMP_FRAME_BASE::OnThresholdChange ), NULL, this );
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,15 +1,16 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Sep 8 2010)
|
||||
// C++ code generated with wxFormBuilder (version Oct 8 2012)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __bitmap2cmp_gui_base__
|
||||
#define __bitmap2cmp_gui_base__
|
||||
#ifndef __BITMAP2CMP_GUI_BASE_H__
|
||||
#define __BITMAP2CMP_GUI_BASE_H__
|
||||
|
||||
#include <wx/artprov.h>
|
||||
#include <wx/xrc/xmlres.h>
|
||||
#include <wx/intl.h>
|
||||
|
||||
#include <wx/scrolwin.h>
|
||||
#include <wx/gdicmn.h>
|
||||
#include <wx/font.h>
|
||||
|
@ -56,8 +57,8 @@ class BM2CMP_FRAME_BASE : public wxFrame
|
|||
wxStaticText* m_BPPValue;
|
||||
wxStaticText* m_BPPunits;
|
||||
wxButton* m_buttonLoad;
|
||||
wxButton* m_buttonExportEeschema;
|
||||
wxButton* m_buttonExportPcbnew;
|
||||
wxButton* m_buttonExport;
|
||||
wxRadioBox* m_radioBoxFormat;
|
||||
wxRadioBox* m_rbOptions;
|
||||
wxStaticText* m_ThresholdText;
|
||||
wxSlider* m_sliderThreshold;
|
||||
|
@ -66,17 +67,17 @@ class BM2CMP_FRAME_BASE : public wxFrame
|
|||
// Virtual event handlers, overide them in your derived class
|
||||
virtual void OnPaint( wxPaintEvent& event ) { event.Skip(); }
|
||||
virtual void OnLoadFile( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnExportEeschema( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnExportPcbnew( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnExport( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnOptionsSelection( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnThresholdChange( wxScrollEvent& event ) { event.Skip(); }
|
||||
|
||||
|
||||
public:
|
||||
|
||||
BM2CMP_FRAME_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Bitmap to Component Converter"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 500,419 ), long style = wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER|wxTAB_TRAVERSAL );
|
||||
BM2CMP_FRAME_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Bitmap to Component Converter"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 527,470 ), long style = wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER|wxTAB_TRAVERSAL );
|
||||
|
||||
~BM2CMP_FRAME_BASE();
|
||||
|
||||
};
|
||||
|
||||
#endif //__bitmap2cmp_gui_base__
|
||||
#endif //__BITMAP2CMP_GUI_BASE_H__
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
/*
|
||||
* This program source code file is part of KICAD, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 1992-2010 jean-pierre.charras
|
||||
* Copyright (C) 1992-2010 Kicad Developers, see change_log.txt for contributors.
|
||||
* Copyright (C) 1992-2013 jean-pierre.charras
|
||||
* Copyright (C) 1992-2013 Kicad Developers, see change_log.txt for contributors.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -22,8 +22,9 @@
|
|||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
#include <cmath>
|
||||
#include <algorithm> // std::max
|
||||
|
||||
// For some unknown reasons, polygon.hpp shoul be included first
|
||||
// For some unknown reasons, polygon.hpp should be included first
|
||||
#include <boost/polygon/polygon.hpp>
|
||||
|
||||
#include <wx/wx.h>
|
||||
|
@ -38,13 +39,6 @@
|
|||
#include <auxiliary.h>
|
||||
|
||||
|
||||
#ifndef max
|
||||
#define max( a, b ) ( ( (a) > (b) ) ? (a) : (b) )
|
||||
#endif
|
||||
#ifndef min
|
||||
#define min( a, b ) ( ( (a) < (b) ) ? (a) : (b) )
|
||||
#endif
|
||||
|
||||
// Define some types used here from boost::polygon
|
||||
namespace bpl = boost::polygon; // bpl = boost polygon library
|
||||
using namespace bpl::operators; // +, -, =, ...
|
||||
|
@ -58,9 +52,12 @@ typedef bpl::point_data<coordinate_type> KPolyPoint; // define a corner o
|
|||
|
||||
enum output_format {
|
||||
POSTSCRIPT_FMT = 1,
|
||||
PCBNEW_FMT,
|
||||
EESCHEMA_FMT
|
||||
PCBNEW_LEGACY_EMP,
|
||||
PCBNEW_KICAD_MOD,
|
||||
EESCHEMA_FMT,
|
||||
KICAD_LOGO
|
||||
};
|
||||
|
||||
/* free a potrace bitmap */
|
||||
static void bm_free( potrace_bitmap_t* bm )
|
||||
{
|
||||
|
@ -172,22 +169,37 @@ int bitmap2component( potrace_bitmap_t* aPotrace_bitmap, FILE* aOutfile, int aFo
|
|||
|
||||
switch( aFormat )
|
||||
{
|
||||
case 2:
|
||||
case 4:
|
||||
info.m_Format = KICAD_LOGO;
|
||||
info.m_ScaleX = 1e3 * 25.4 / 300; // the conversion scale from PPI to micro
|
||||
info.m_ScaleY = info.m_ScaleX; // Y axis is top to bottom
|
||||
info.CreateOutputFile();
|
||||
break;
|
||||
|
||||
case 3:
|
||||
info.m_Format = POSTSCRIPT_FMT;
|
||||
info.m_ScaleX = info.m_ScaleY = 1.0; // the conversion scale
|
||||
info.m_ScaleX = 1.0; // the conversion scale
|
||||
info.m_ScaleY = info.m_ScaleX;
|
||||
// output vector data, e.g. as a rudimentary EPS file (mainly for tests)
|
||||
info.CreateOutputFile();
|
||||
break;
|
||||
|
||||
case 1:
|
||||
case 2:
|
||||
info.m_Format = EESCHEMA_FMT;
|
||||
info.m_ScaleX = 1000.0 / 300; // the conversion scale
|
||||
info.m_ScaleX = 1000.0 / 300; // the conversion scale from PPI to UI
|
||||
info.m_ScaleY = -info.m_ScaleX; // Y axis is bottom to Top for components in libs
|
||||
info.CreateOutputFile();
|
||||
break;
|
||||
|
||||
case 1:
|
||||
info.m_Format = PCBNEW_KICAD_MOD;
|
||||
info.m_ScaleX = 1e6 * 25.4 / 300; // the conversion scale from PPI to UI
|
||||
info.m_ScaleY = info.m_ScaleX; // Y axis is top to bottom in modedit
|
||||
info.CreateOutputFile();
|
||||
break;
|
||||
|
||||
case 0:
|
||||
info.m_Format = PCBNEW_FMT;
|
||||
info.m_Format = PCBNEW_LEGACY_EMP;
|
||||
info.m_ScaleX = 10000.0 / 300; // the conversion scale
|
||||
info.m_ScaleY = info.m_ScaleX; // Y axis is top to bottom in modedit
|
||||
info.CreateOutputFile();
|
||||
|
@ -221,7 +233,7 @@ void BITMAPCONV_INFO::OuputFileHeader()
|
|||
fprintf( m_Outfile, "gsave\n" );
|
||||
break;
|
||||
|
||||
case PCBNEW_FMT:
|
||||
case PCBNEW_LEGACY_EMP:
|
||||
#define FIELD_LAYER 21
|
||||
fieldSize = 600; // fields text size = 60 mils
|
||||
Ypos += fieldSize / 2;
|
||||
|
@ -240,6 +252,22 @@ void BITMAPCONV_INFO::OuputFileHeader()
|
|||
-Ypos, fieldSize, fieldSize, fieldSize / 5, FIELD_LAYER, m_CmpName );
|
||||
break;
|
||||
|
||||
case PCBNEW_KICAD_MOD:
|
||||
// fields text size = 1.5 mm
|
||||
// fields text thickness = 1.5 / 5 = 0.3mm
|
||||
fprintf( m_Outfile, "(module %s (layer F.Cu)\n (at 0 0)\n",
|
||||
m_CmpName );
|
||||
fprintf( m_Outfile, " (fp_text reference \"G***\" (at 0 0) (layer F.SilkS) hide\n"
|
||||
" (effects (font (thickness 0.3)))\n )\n" );
|
||||
fprintf( m_Outfile, " (fp_text value \"%s\" (at 0.75 0) (layer F.SilkS) hide\n"
|
||||
" (effects (font (thickness 0.3)))\n )\n",
|
||||
m_CmpName );
|
||||
break;
|
||||
|
||||
case KICAD_LOGO:
|
||||
fprintf( m_Outfile, "(polygon (pos 0 0 rbcorner) (rotate 0) (linewidth 0.01)\n" );
|
||||
break;
|
||||
|
||||
case EESCHEMA_FMT:
|
||||
fprintf( m_Outfile, "EESchema-LIBRARY Version 2.3\n" );
|
||||
fprintf( m_Outfile, "#\n# %s\n", m_CmpName );
|
||||
|
@ -267,11 +295,19 @@ void BITMAPCONV_INFO::OuputFileEnd()
|
|||
fprintf( m_Outfile, "%%EOF\n" );
|
||||
break;
|
||||
|
||||
case PCBNEW_FMT:
|
||||
case PCBNEW_LEGACY_EMP:
|
||||
fprintf( m_Outfile, "$EndMODULE %s\n", m_CmpName );
|
||||
fprintf( m_Outfile, "$EndLIBRARY\n" );
|
||||
break;
|
||||
|
||||
case PCBNEW_KICAD_MOD:
|
||||
fprintf( m_Outfile, ")\n" );
|
||||
break;
|
||||
|
||||
case KICAD_LOGO:
|
||||
fprintf( m_Outfile, ")\n" );
|
||||
break;
|
||||
|
||||
case EESCHEMA_FMT:
|
||||
fprintf( m_Outfile, "ENDDRAW\n" );
|
||||
fprintf( m_Outfile, "ENDDEF\n" );
|
||||
|
@ -282,11 +318,11 @@ void BITMAPCONV_INFO::OuputFileEnd()
|
|||
/**
|
||||
* Function OuputOnePolygon
|
||||
* write one polygon to output file.
|
||||
* Polygon coordinates are expected scaled by the polugon extraction function
|
||||
* Polygon coordinates are expected scaled by the polygon extraction function
|
||||
*/
|
||||
void BITMAPCONV_INFO::OuputOnePolygon( KPolygon & aPolygon )
|
||||
{
|
||||
unsigned ii;
|
||||
unsigned ii, jj;
|
||||
KPolyPoint currpoint;
|
||||
|
||||
int offsetX = (int)( m_PixmapWidth / 2 * m_ScaleX );
|
||||
|
@ -297,19 +333,27 @@ void BITMAPCONV_INFO::OuputOnePolygon( KPolygon & aPolygon )
|
|||
switch( m_Format )
|
||||
{
|
||||
case POSTSCRIPT_FMT:
|
||||
fprintf( m_Outfile, "%d %d moveto\n",
|
||||
startpoint.x(), startpoint.y() );
|
||||
offsetY = (int)( m_PixmapHeight * m_ScaleY );
|
||||
fprintf( m_Outfile, "newpath\n%d %d moveto\n",
|
||||
startpoint.x(), offsetY - startpoint.y() );
|
||||
jj = 0;
|
||||
for( ii = 1; ii < aPolygon.size(); ii++ )
|
||||
{
|
||||
currpoint = *(aPolygon.begin() + ii);
|
||||
fprintf( m_Outfile, "%d %d lineto\n",
|
||||
currpoint.x(), currpoint.y() );
|
||||
fprintf( m_Outfile, " %d %d lineto",
|
||||
currpoint.x(), offsetY - currpoint.y() );
|
||||
|
||||
if( jj++ > 6 )
|
||||
{
|
||||
jj = 0;
|
||||
fprintf( m_Outfile, ("\n") );
|
||||
}
|
||||
}
|
||||
|
||||
fprintf( m_Outfile, "0 setgray fill\n" );
|
||||
fprintf( m_Outfile, "\nclosepath fill\n" );
|
||||
break;
|
||||
|
||||
case PCBNEW_FMT:
|
||||
case PCBNEW_LEGACY_EMP:
|
||||
{
|
||||
LAYER_NUM layer = SILKSCREEN_N_FRONT;
|
||||
int width = 1;
|
||||
|
@ -330,6 +374,54 @@ void BITMAPCONV_INFO::OuputOnePolygon( KPolygon & aPolygon )
|
|||
}
|
||||
break;
|
||||
|
||||
case PCBNEW_KICAD_MOD:
|
||||
{
|
||||
double width = 0.1;
|
||||
fprintf( m_Outfile, " (fp_poly (pts" );
|
||||
|
||||
jj = 0;
|
||||
for( ii = 0; ii < aPolygon.size(); ii++ )
|
||||
{
|
||||
currpoint = *( aPolygon.begin() + ii );
|
||||
fprintf( m_Outfile, " (xy %f %f)",
|
||||
(currpoint.x() - offsetX) / 1e6,
|
||||
(currpoint.y() - offsetY) / 1e6 );
|
||||
|
||||
if( jj++ > 6 )
|
||||
{
|
||||
jj = 0;
|
||||
fprintf( m_Outfile, ("\n ") );
|
||||
}
|
||||
}
|
||||
// Close polygon
|
||||
fprintf( m_Outfile, " (xy %f %f) )",
|
||||
(startpoint.x() - offsetX) / 1e6, (startpoint.y() - offsetY) / 1e6 );
|
||||
fprintf( m_Outfile, "(layer F.SilkS) (width %f)\n )\n", width );
|
||||
}
|
||||
break;
|
||||
|
||||
case KICAD_LOGO:
|
||||
fprintf( m_Outfile, " (pts" );
|
||||
// Internal units = micron, file unit = mm
|
||||
jj = 0;
|
||||
for( ii = 0; ii < aPolygon.size(); ii++ )
|
||||
{
|
||||
currpoint = *( aPolygon.begin() + ii );
|
||||
fprintf( m_Outfile, " (xy %.3f %.3f)",
|
||||
(currpoint.x() - offsetX) / 1e3,
|
||||
(currpoint.y() - offsetY) / 1e3 );
|
||||
|
||||
if( jj++ > 4 )
|
||||
{
|
||||
jj = 0;
|
||||
fprintf( m_Outfile, ("\n ") );
|
||||
}
|
||||
}
|
||||
// Close polygon
|
||||
fprintf( m_Outfile, " (xy %.3f %.3f) )\n",
|
||||
(startpoint.x() - offsetX) / 1e3, (startpoint.y() - offsetY) / 1e3 );
|
||||
break;
|
||||
|
||||
case EESCHEMA_FMT:
|
||||
fprintf( m_Outfile, "P %d 0 0 1", (int) aPolygon.size() + 1 );
|
||||
for( ii = 0; ii < aPolygon.size(); ii++ )
|
||||
|
@ -363,6 +455,9 @@ void BITMAPCONV_INFO::CreateOutputFile()
|
|||
KPolygonSet polyset_holes;
|
||||
|
||||
potrace_dpoint_t( *c )[3];
|
||||
|
||||
setlocale( LC_NUMERIC, "C" ); // Switch the locale to standard C
|
||||
|
||||
OuputFileHeader();
|
||||
|
||||
bool main_outline = true;
|
||||
|
@ -451,6 +546,8 @@ void BITMAPCONV_INFO::CreateOutputFile()
|
|||
}
|
||||
|
||||
OuputFileEnd();
|
||||
|
||||
setlocale( LC_NUMERIC, "" ); // revert to the current locale
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -112,6 +112,9 @@ set(COMMON_SRCS
|
|||
msgpanel.cpp
|
||||
netlist_keywords.cpp
|
||||
newstroke_font.cpp
|
||||
page_layout_default_description.cpp
|
||||
page_layout_reader_keywords.cpp
|
||||
page_layout_reader.cpp
|
||||
projet_config.cpp
|
||||
ptree.cpp
|
||||
reporter.cpp
|
||||
|
@ -237,6 +240,15 @@ make_lexer(
|
|||
FP_LIB_TABLE_T
|
||||
)
|
||||
|
||||
# auto-generate page layout reader s-expression page_layout_reader_lexer.h
|
||||
# and title_block_reader_keywords.cpp.
|
||||
make_lexer(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/page_layout_reader.keywords
|
||||
${PROJECT_SOURCE_DIR}/include/page_layout_reader_lexer.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/page_layout_reader_keywords.cpp
|
||||
TB_READER_T
|
||||
)
|
||||
|
||||
# The dsntest may not build properly using MS Visual Studio.
|
||||
if(NOT MSVC)
|
||||
# This one gets made only when testing.
|
||||
|
|
|
@ -7,9 +7,9 @@
|
|||
|
||||
#ifndef KICAD_BUILD_VERSION
|
||||
#if defined KICAD_GOST
|
||||
# define KICAD_BUILD_VERSION "(2013-mar-13 GOST)"
|
||||
# define KICAD_BUILD_VERSION "(2013-jun-18 GOST)"
|
||||
#else
|
||||
# define KICAD_BUILD_VERSION "(2013-mar-13)"
|
||||
# define KICAD_BUILD_VERSION "(2013-jun-18)"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
|
|
@ -40,6 +40,20 @@
|
|||
|
||||
#include <wx/process.h>
|
||||
|
||||
|
||||
// Fail build if wxWidgets printing was not configured.
|
||||
#if !wxUSE_PRINTING_ARCHITECTURE && !SWIG
|
||||
# error "You must use '--enable-printarch' in your wx library configuration."
|
||||
#endif
|
||||
|
||||
// Show warning if wxWidgets Gnome or GTK printing was not configured.
|
||||
#if defined( __WXGTK__ )
|
||||
# if !wxUSE_LIBGNOMEPRINT && !wxUSE_GTKPRINT && !SWIG
|
||||
# warning "You must use '--with-gnomeprint' or '--with-gtkprint' in your wx library configuration for full print capabilities."
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* Global variables definitions.
|
||||
*
|
||||
|
|
|
@ -35,6 +35,8 @@
|
|||
#include <drawtxt.h>
|
||||
#include <class_title_block.h>
|
||||
#include "worksheet_shape_builder.h"
|
||||
#include <wx/filename.h>
|
||||
|
||||
|
||||
|
||||
wxString GetDefaultPlotExtension( PlotFormat aFormat )
|
||||
|
@ -98,8 +100,12 @@ void PlotWorkSheet( PLOTTER* plotter, const TITLE_BLOCK& aTitleBlock,
|
|||
drawList.SetSheetNumber( aSheetNumber );
|
||||
drawList.SetSheetCount( aNumberOfSheets );
|
||||
|
||||
drawList.BuildWorkSheetGraphicList( aPageInfo.GetType(), aSheetDesc,
|
||||
aFilename, aTitleBlock, plotColor, plotColor );
|
||||
// Print only a short filename, if aFilename is the full filename
|
||||
|
||||
wxFileName fn( aFilename );
|
||||
|
||||
drawList.BuildWorkSheetGraphicList( aPageInfo.GetType(), fn.GetFullName(),
|
||||
aSheetDesc, aTitleBlock, plotColor, plotColor );
|
||||
|
||||
// Draw item list
|
||||
for( WS_DRAW_ITEM_BASE* item = drawList.GetFirst(); item;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Apr 16 2008)
|
||||
// C++ code generated with wxFormBuilder (version Oct 8 2012)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
|
@ -9,7 +9,7 @@
|
|||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
DIALOG_DISPLAY_HTML_TEXT_BASE::DIALOG_DISPLAY_HTML_TEXT_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
|
||||
DIALOG_DISPLAY_HTML_TEXT_BASE::DIALOG_DISPLAY_HTML_TEXT_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style )
|
||||
{
|
||||
this->SetSizeHints( wxSize( 400,120 ), wxDefaultSize );
|
||||
|
||||
|
@ -23,6 +23,7 @@ DIALOG_DISPLAY_HTML_TEXT_BASE::DIALOG_DISPLAY_HTML_TEXT_BASE( wxWindow* parent,
|
|||
m_buttonClose->SetDefault();
|
||||
bMainSizer->Add( m_buttonClose, 0, wxALIGN_RIGHT|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
|
||||
this->SetSizer( bMainSizer );
|
||||
this->Layout();
|
||||
|
||||
|
@ -36,4 +37,5 @@ DIALOG_DISPLAY_HTML_TEXT_BASE::~DIALOG_DISPLAY_HTML_TEXT_BASE()
|
|||
// Disconnect Events
|
||||
m_htmlWindow->Disconnect( wxEVT_COMMAND_HTML_LINK_CLICKED, wxHtmlLinkEventHandler( DIALOG_DISPLAY_HTML_TEXT_BASE::OnHTMLLinkClicked ), NULL, this );
|
||||
m_buttonClose->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_DISPLAY_HTML_TEXT_BASE::OnCloseButtonClick ), NULL, this );
|
||||
|
||||
}
|
||||
|
|
|
@ -2,9 +2,13 @@
|
|||
<wxFormBuilder_Project>
|
||||
<FileVersion major="1" minor="11" />
|
||||
<object class="Project" expanded="1">
|
||||
<property name="class_decoration" />
|
||||
<property name="class_decoration"></property>
|
||||
<property name="code_generation">C++</property>
|
||||
<property name="disconnect_events">1</property>
|
||||
<property name="disconnect_mode">source_name</property>
|
||||
<property name="disconnect_php_events">0</property>
|
||||
<property name="disconnect_python_events">0</property>
|
||||
<property name="embedded_files_path">res</property>
|
||||
<property name="encoding">UTF-8</property>
|
||||
<property name="event_generation">connect</property>
|
||||
<property name="file">dialog_display_info_HTML_base</property>
|
||||
|
@ -12,64 +16,76 @@
|
|||
<property name="help_provider">none</property>
|
||||
<property name="internationalize">1</property>
|
||||
<property name="name">dialog_display_info_HTML</property>
|
||||
<property name="namespace" />
|
||||
<property name="namespace"></property>
|
||||
<property name="path">.</property>
|
||||
<property name="precompiled_header" />
|
||||
<property name="precompiled_header"></property>
|
||||
<property name="relative_path">1</property>
|
||||
<property name="skip_php_events">1</property>
|
||||
<property name="skip_python_events">1</property>
|
||||
<property name="use_enum">0</property>
|
||||
<property name="use_microsoft_bom">0</property>
|
||||
<object class="Dialog" expanded="1">
|
||||
<property name="bg" />
|
||||
<property name="center" />
|
||||
<property name="context_help" />
|
||||
<property name="aui_managed">0</property>
|
||||
<property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
|
||||
<property name="bg"></property>
|
||||
<property name="center"></property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="extra_style" />
|
||||
<property name="fg" />
|
||||
<property name="font" />
|
||||
<property name="event_handler">impl_virtual</property>
|
||||
<property name="extra_style"></property>
|
||||
<property name="fg"></property>
|
||||
<property name="font"></property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="maximum_size" />
|
||||
<property name="maximum_size"></property>
|
||||
<property name="minimum_size">400,120</property>
|
||||
<property name="name">DIALOG_DISPLAY_HTML_TEXT_BASE</property>
|
||||
<property name="pos" />
|
||||
<property name="pos"></property>
|
||||
<property name="size">431,120</property>
|
||||
<property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property>
|
||||
<property name="subclass" />
|
||||
<property name="title" />
|
||||
<property name="tooltip" />
|
||||
<property name="window_extra_style" />
|
||||
<property name="window_name" />
|
||||
<property name="window_style" />
|
||||
<event name="OnActivate" />
|
||||
<event name="OnActivateApp" />
|
||||
<event name="OnChar" />
|
||||
<event name="OnClose" />
|
||||
<event name="OnEnterWindow" />
|
||||
<event name="OnEraseBackground" />
|
||||
<event name="OnHibernate" />
|
||||
<event name="OnIconize" />
|
||||
<event name="OnIdle" />
|
||||
<event name="OnInitDialog" />
|
||||
<event name="OnKeyDown" />
|
||||
<event name="OnKeyUp" />
|
||||
<event name="OnKillFocus" />
|
||||
<event name="OnLeaveWindow" />
|
||||
<event name="OnLeftDClick" />
|
||||
<event name="OnLeftDown" />
|
||||
<event name="OnLeftUp" />
|
||||
<event name="OnMiddleDClick" />
|
||||
<event name="OnMiddleDown" />
|
||||
<event name="OnMiddleUp" />
|
||||
<event name="OnMotion" />
|
||||
<event name="OnMouseEvents" />
|
||||
<event name="OnMouseWheel" />
|
||||
<event name="OnPaint" />
|
||||
<event name="OnRightDClick" />
|
||||
<event name="OnRightDown" />
|
||||
<event name="OnRightUp" />
|
||||
<event name="OnSetFocus" />
|
||||
<event name="OnSize" />
|
||||
<event name="OnUpdateUI" />
|
||||
<property name="subclass">DIALOG_SHIM; dialog_shim.h</property>
|
||||
<property name="title"></property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnActivate"></event>
|
||||
<event name="OnActivateApp"></event>
|
||||
<event name="OnAuiFindManager"></event>
|
||||
<event name="OnAuiPaneButton"></event>
|
||||
<event name="OnAuiPaneClose"></event>
|
||||
<event name="OnAuiPaneMaximize"></event>
|
||||
<event name="OnAuiPaneRestore"></event>
|
||||
<event name="OnAuiRender"></event>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnClose"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnHibernate"></event>
|
||||
<event name="OnIconize"></event>
|
||||
<event name="OnIdle"></event>
|
||||
<event name="OnInitDialog"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
<object class="wxBoxSizer" expanded="1">
|
||||
<property name="minimum_size">-1,-1</property>
|
||||
<property name="name">bMainSizer</property>
|
||||
|
@ -80,51 +96,83 @@
|
|||
<property name="flag">wxEXPAND</property>
|
||||
<property name="proportion">1</property>
|
||||
<object class="wxHtmlWindow" expanded="1">
|
||||
<property name="bg" />
|
||||
<property name="context_help" />
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg" />
|
||||
<property name="font" />
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="maximum_size" />
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size">-1,-1</property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">m_htmlWindow</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">public</property>
|
||||
<property name="pos" />
|
||||
<property name="size" />
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style">wxHW_SCROLLBAR_AUTO</property>
|
||||
<property name="subclass" />
|
||||
<property name="tooltip" />
|
||||
<property name="window_extra_style" />
|
||||
<property name="window_name" />
|
||||
<property name="subclass"></property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style">wxSUNKEN_BORDER</property>
|
||||
<event name="OnChar" />
|
||||
<event name="OnEnterWindow" />
|
||||
<event name="OnEraseBackground" />
|
||||
<event name="OnHtmlCellClicked" />
|
||||
<event name="OnHtmlCellHover" />
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnHtmlCellClicked"></event>
|
||||
<event name="OnHtmlCellHover"></event>
|
||||
<event name="OnHtmlLinkClicked">OnHTMLLinkClicked</event>
|
||||
<event name="OnKeyDown" />
|
||||
<event name="OnKeyUp" />
|
||||
<event name="OnKillFocus" />
|
||||
<event name="OnLeaveWindow" />
|
||||
<event name="OnLeftDClick" />
|
||||
<event name="OnLeftDown" />
|
||||
<event name="OnLeftUp" />
|
||||
<event name="OnMiddleDClick" />
|
||||
<event name="OnMiddleDown" />
|
||||
<event name="OnMiddleUp" />
|
||||
<event name="OnMotion" />
|
||||
<event name="OnMouseEvents" />
|
||||
<event name="OnMouseWheel" />
|
||||
<event name="OnPaint" />
|
||||
<event name="OnRightDClick" />
|
||||
<event name="OnRightDown" />
|
||||
<event name="OnRightUp" />
|
||||
<event name="OnSetFocus" />
|
||||
<event name="OnSize" />
|
||||
<event name="OnUpdateUI" />
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
|
@ -132,51 +180,87 @@
|
|||
<property name="flag">wxALIGN_RIGHT|wxRIGHT|wxLEFT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxButton" expanded="1">
|
||||
<property name="bg" />
|
||||
<property name="context_help" />
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg" />
|
||||
<property name="font" />
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_CANCEL</property>
|
||||
<property name="label">Close</property>
|
||||
<property name="maximum_size" />
|
||||
<property name="minimum_size" />
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">m_buttonClose</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pos" />
|
||||
<property name="size" />
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style">wxBU_EXACTFIT</property>
|
||||
<property name="subclass" />
|
||||
<property name="tooltip" />
|
||||
<property name="window_extra_style" />
|
||||
<property name="window_name" />
|
||||
<property name="window_style" />
|
||||
<property name="subclass"></property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="validator_data_type"></property>
|
||||
<property name="validator_style">wxFILTER_NONE</property>
|
||||
<property name="validator_type">wxDefaultValidator</property>
|
||||
<property name="validator_variable"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnButtonClick">OnCloseButtonClick</event>
|
||||
<event name="OnChar" />
|
||||
<event name="OnEnterWindow" />
|
||||
<event name="OnEraseBackground" />
|
||||
<event name="OnKeyDown" />
|
||||
<event name="OnKeyUp" />
|
||||
<event name="OnKillFocus" />
|
||||
<event name="OnLeaveWindow" />
|
||||
<event name="OnLeftDClick" />
|
||||
<event name="OnLeftDown" />
|
||||
<event name="OnLeftUp" />
|
||||
<event name="OnMiddleDClick" />
|
||||
<event name="OnMiddleDown" />
|
||||
<event name="OnMiddleUp" />
|
||||
<event name="OnMotion" />
|
||||
<event name="OnMouseEvents" />
|
||||
<event name="OnMouseWheel" />
|
||||
<event name="OnPaint" />
|
||||
<event name="OnRightDClick" />
|
||||
<event name="OnRightDown" />
|
||||
<event name="OnRightUp" />
|
||||
<event name="OnSetFocus" />
|
||||
<event name="OnSize" />
|
||||
<event name="OnUpdateUI" />
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
|
|
|
@ -1,15 +1,19 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Apr 16 2008)
|
||||
// C++ code generated with wxFormBuilder (version Oct 8 2012)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __dialog_display_info_HTML_base__
|
||||
#define __dialog_display_info_HTML_base__
|
||||
#ifndef __DIALOG_DISPLAY_INFO_HTML_BASE_H__
|
||||
#define __DIALOG_DISPLAY_INFO_HTML_BASE_H__
|
||||
|
||||
#include <wx/artprov.h>
|
||||
#include <wx/xrc/xmlres.h>
|
||||
#include <wx/intl.h>
|
||||
class DIALOG_SHIM;
|
||||
|
||||
#include "dialog_shim.h"
|
||||
#include <wx/html/htmlwin.h>
|
||||
#include <wx/gdicmn.h>
|
||||
#include <wx/font.h>
|
||||
|
@ -26,7 +30,7 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
/// Class DIALOG_DISPLAY_HTML_TEXT_BASE
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
class DIALOG_DISPLAY_HTML_TEXT_BASE : public wxDialog
|
||||
class DIALOG_DISPLAY_HTML_TEXT_BASE : public DIALOG_SHIM
|
||||
{
|
||||
private:
|
||||
|
||||
|
@ -34,15 +38,16 @@ class DIALOG_DISPLAY_HTML_TEXT_BASE : public wxDialog
|
|||
wxButton* m_buttonClose;
|
||||
|
||||
// Virtual event handlers, overide them in your derived class
|
||||
virtual void OnHTMLLinkClicked( wxHtmlLinkEvent& event ){ event.Skip(); }
|
||||
virtual void OnCloseButtonClick( wxCommandEvent& event ){ event.Skip(); }
|
||||
virtual void OnHTMLLinkClicked( wxHtmlLinkEvent& event ) { event.Skip(); }
|
||||
virtual void OnCloseButtonClick( wxCommandEvent& event ) { event.Skip(); }
|
||||
|
||||
|
||||
public:
|
||||
wxHtmlWindow* m_htmlWindow;
|
||||
DIALOG_DISPLAY_HTML_TEXT_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 431,120 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
|
||||
|
||||
DIALOG_DISPLAY_HTML_TEXT_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 431,120 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
|
||||
~DIALOG_DISPLAY_HTML_TEXT_BASE();
|
||||
|
||||
};
|
||||
|
||||
#endif //__dialog_display_info_HTML_base__
|
||||
#endif //__DIALOG_DISPLAY_INFO_HTML_BASE_H__
|
||||
|
|
|
@ -729,13 +729,13 @@ bool EDA_DRAW_FRAME::HandleBlockBegin( wxDC* aDC, int aKey, const wxPoint& aPosi
|
|||
break;
|
||||
|
||||
default:
|
||||
{
|
||||
wxString msg;
|
||||
msg << wxT( "EDA_DRAW_FRAME::HandleBlockBegin() error: Unknown command " ) <<
|
||||
Block->GetCommand();
|
||||
DisplayError( this, msg );
|
||||
}
|
||||
break;
|
||||
{
|
||||
wxString msg;
|
||||
msg << wxT( "EDA_DRAW_FRAME::HandleBlockBegin() error: Unknown command " ) <<
|
||||
Block->GetCommand();
|
||||
DisplayError( this, msg );
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
Block->SetMessageBlock( this );
|
||||
|
|
|
@ -831,16 +831,26 @@ void EDA_DRAW_PANEL::OnMouseLeaving( wxMouseEvent& event )
|
|||
if( !m_enableAutoPan || !m_requestAutoPan || m_ignoreMouseEvents )
|
||||
return;
|
||||
|
||||
// Auto pan if mouse is leave working area:
|
||||
// Auto pan when mouse has left the client window
|
||||
// Ensure the cross_hair position is updated,
|
||||
// because it will be used to center the screen.
|
||||
// We use a position inside the client window
|
||||
wxSize size = GetClientSize();
|
||||
wxPoint cross_hair_pos = event.GetPosition();
|
||||
cross_hair_pos.x = std::min( cross_hair_pos.x, size.x );
|
||||
cross_hair_pos.y = std::min( cross_hair_pos.y, size.x );
|
||||
cross_hair_pos.x = std::max( cross_hair_pos.x, 0 );
|
||||
cross_hair_pos.y = std::max( cross_hair_pos.y, 0 );
|
||||
|
||||
if( ( size.x < event.GetX() ) || ( size.y < event.GetY() )
|
||||
|| ( event.GetX() <= 0) || ( event.GetY() <= 0 ) )
|
||||
{
|
||||
wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED, ID_POPUP_ZOOM_CENTER );
|
||||
cmd.SetEventObject( this );
|
||||
GetEventHandler()->ProcessEvent( cmd );
|
||||
}
|
||||
INSTALL_UNBUFFERED_DC( dc, this );
|
||||
cross_hair_pos.x = dc.DeviceToLogicalX( cross_hair_pos.x );
|
||||
cross_hair_pos.y = dc.DeviceToLogicalY( cross_hair_pos.y );
|
||||
|
||||
GetScreen()->SetCrossHairPosition( cross_hair_pos );
|
||||
|
||||
wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED, ID_POPUP_ZOOM_CENTER );
|
||||
cmd.SetEventObject( this );
|
||||
GetEventHandler()->ProcessEvent( cmd );
|
||||
|
||||
event.Skip();
|
||||
}
|
||||
|
|
|
@ -242,7 +242,7 @@ static void DrawGraphicTextPline( EDA_RECT* aClipBox,
|
|||
/**
|
||||
* Function DrawGraphicText
|
||||
* Draw a graphic text (like module texts)
|
||||
* @param aPanel = the current m_canvas. NULL if draw within a 3D GL Canvas
|
||||
* @param aClipBox = the clipping rect, or NULL if no clipping
|
||||
* @param aDC = the current Device Context. NULL if draw within a 3D GL Canvas
|
||||
* @param aPos = text position (according to h_justify, v_justify)
|
||||
* @param aColor (enum EDA_COLOR_T) = text color
|
||||
|
@ -261,7 +261,7 @@ static void DrawGraphicTextPline( EDA_RECT* aClipBox,
|
|||
* @param aPlotter = a pointer to a PLOTTER instance, when this function is used to plot
|
||||
* the text. NULL to draw this text.
|
||||
*/
|
||||
void DrawGraphicText( EDA_DRAW_PANEL* aPanel,
|
||||
void DrawGraphicText( EDA_RECT* aClipBox,
|
||||
wxDC* aDC,
|
||||
const wxPoint& aPos,
|
||||
EDA_COLOR_T aColor,
|
||||
|
@ -284,9 +284,6 @@ void DrawGraphicText( EDA_DRAW_PANEL* aPanel,
|
|||
wxPoint current_char_pos; // Draw coordinates for the current char
|
||||
wxPoint overbar_pos; // Start point for the current overbar
|
||||
int overbar_italic_comp; // Italic compensation for overbar
|
||||
EDA_RECT* clipBox; // Clip box used in basic draw functions
|
||||
|
||||
clipBox = aPanel ? aPanel->GetClipBox() : NULL;
|
||||
#define BUF_SIZE 100
|
||||
wxPoint coord[BUF_SIZE + 1]; // Buffer coordinate used to draw polylines (one char shape)
|
||||
bool sketch_mode = false;
|
||||
|
@ -322,7 +319,7 @@ void DrawGraphicText( EDA_DRAW_PANEL* aPanel,
|
|||
dy = size_v;
|
||||
|
||||
/* Do not draw the text if out of draw area! */
|
||||
if( aPanel )
|
||||
if( aClipBox )
|
||||
{
|
||||
int xm, ym, ll, xc, yc;
|
||||
ll = std::abs( dx );
|
||||
|
@ -330,10 +327,10 @@ void DrawGraphicText( EDA_DRAW_PANEL* aPanel,
|
|||
xc = current_char_pos.x;
|
||||
yc = current_char_pos.y;
|
||||
|
||||
x0 = aPanel->GetClipBox()->GetX() - ll;
|
||||
y0 = aPanel->GetClipBox()->GetY() - ll;
|
||||
xm = aPanel->GetClipBox()->GetRight() + ll;
|
||||
ym = aPanel->GetClipBox()->GetBottom() + ll;
|
||||
x0 = aClipBox->GetX() - ll;
|
||||
y0 = aClipBox->GetY() - ll;
|
||||
xm = aClipBox->GetRight() + ll;
|
||||
ym = aClipBox->GetBottom() + ll;
|
||||
|
||||
if( xc < x0 )
|
||||
return;
|
||||
|
@ -407,7 +404,7 @@ void DrawGraphicText( EDA_DRAW_PANEL* aPanel,
|
|||
aCallback( current_char_pos.x, current_char_pos.y, end.x, end.y );
|
||||
}
|
||||
else
|
||||
GRLine( clipBox, aDC,
|
||||
GRLine( aClipBox, aDC,
|
||||
current_char_pos.x, current_char_pos.y, end.x, end.y, aWidth, aColor );
|
||||
|
||||
return;
|
||||
|
@ -461,7 +458,7 @@ void DrawGraphicText( EDA_DRAW_PANEL* aPanel,
|
|||
RotatePoint( &overbar_pos, aPos, aOrient );
|
||||
coord[1] = overbar_pos;
|
||||
// Plot the overbar segment
|
||||
DrawGraphicTextPline( clipBox, aDC, aColor, aWidth,
|
||||
DrawGraphicTextPline( aClipBox, aDC, aColor, aWidth,
|
||||
sketch_mode, 2, coord, aCallback, aPlotter );
|
||||
}
|
||||
|
||||
|
@ -508,7 +505,7 @@ void DrawGraphicText( EDA_DRAW_PANEL* aPanel,
|
|||
if( aWidth <= 1 )
|
||||
aWidth = 0;
|
||||
|
||||
DrawGraphicTextPline( clipBox, aDC, aColor, aWidth,
|
||||
DrawGraphicTextPline( aClipBox, aDC, aColor, aWidth,
|
||||
sketch_mode, point_count, coord,
|
||||
aCallback, aPlotter );
|
||||
}
|
||||
|
@ -554,13 +551,12 @@ void DrawGraphicText( EDA_DRAW_PANEL* aPanel,
|
|||
coord[1] = overbar_pos;
|
||||
|
||||
// Plot the overbar segment
|
||||
DrawGraphicTextPline( clipBox, aDC, aColor, aWidth,
|
||||
DrawGraphicTextPline( aClipBox, aDC, aColor, aWidth,
|
||||
sketch_mode, 2, coord, aCallback, aPlotter );
|
||||
}
|
||||
}
|
||||
|
||||
void DrawGraphicHaloText( EDA_DRAW_PANEL * aPanel,
|
||||
wxDC * aDC,
|
||||
void DrawGraphicHaloText( EDA_RECT* aClipBox, wxDC * aDC,
|
||||
const wxPoint &aPos,
|
||||
enum EDA_COLOR_T aBgColor,
|
||||
enum EDA_COLOR_T aColor1,
|
||||
|
@ -570,24 +566,23 @@ void DrawGraphicHaloText( EDA_DRAW_PANEL * aPanel,
|
|||
const wxSize &aSize,
|
||||
enum EDA_TEXT_HJUSTIFY_T aH_justify,
|
||||
enum EDA_TEXT_VJUSTIFY_T aV_justify,
|
||||
int aWidth,
|
||||
bool aItalic,
|
||||
bool aBold,
|
||||
int aWidth, bool aItalic, bool aBold,
|
||||
void (*aCallback)( int x0, int y0, int xf, int yf ),
|
||||
PLOTTER * aPlotter )
|
||||
{
|
||||
// Swap color if contrast would be better
|
||||
if( ColorIsLight( aBgColor ) ) {
|
||||
if( ColorIsLight( aBgColor ) )
|
||||
{
|
||||
EDA_COLOR_T c = aColor1;
|
||||
aColor1 = aColor2;
|
||||
aColor2 = c;
|
||||
}
|
||||
|
||||
DrawGraphicText( aPanel, aDC, aPos, aColor1, aText, aOrient, aSize,
|
||||
DrawGraphicText( aClipBox, aDC, aPos, aColor1, aText, aOrient, aSize,
|
||||
aH_justify, aV_justify, aWidth, aItalic, aBold,
|
||||
aCallback, aPlotter );
|
||||
|
||||
DrawGraphicText( aPanel, aDC, aPos, aColor2, aText, aOrient, aSize,
|
||||
DrawGraphicText( aClipBox, aDC, aPos, aColor2, aText, aOrient, aSize,
|
||||
aH_justify, aV_justify, aWidth / 4, aItalic, aBold,
|
||||
aCallback, aPlotter );
|
||||
}
|
||||
|
|
|
@ -33,20 +33,9 @@
|
|||
#include <fctsys.h>
|
||||
#include <dsnlexer.h>
|
||||
|
||||
//#include "fctsys.h"
|
||||
//#include "pcbnew.h"
|
||||
|
||||
//#define STANDALONE 1 // enable this for stand alone testing.
|
||||
|
||||
static int compare( const void* a1, const void* a2 )
|
||||
{
|
||||
const KEYWORD* k1 = (const KEYWORD*) a1;
|
||||
const KEYWORD* k2 = (const KEYWORD*) a2;
|
||||
|
||||
int ret = strcmp( k1->name, k2->name );
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
//-----<DSNLEXER>-------------------------------------------------------------
|
||||
|
||||
|
@ -61,6 +50,23 @@ void DSNLEXER::init()
|
|||
space_in_quoted_tokens = false;
|
||||
|
||||
commentsAreTokens = false;
|
||||
|
||||
#if 1
|
||||
if( keywordCount > 11 )
|
||||
{
|
||||
// resize the hashtable bucket count
|
||||
keyword_hash.reserve( keywordCount );
|
||||
}
|
||||
|
||||
// fill the specialized "C string" hashtable from keywords[]
|
||||
const KEYWORD* it = keywords;
|
||||
const KEYWORD* end = it + keywordCount;
|
||||
|
||||
for( ; it < end; ++it )
|
||||
{
|
||||
keyword_hash[it->name] = it->token;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
@ -168,21 +174,21 @@ LINE_READER* DSNLEXER::PopReader()
|
|||
}
|
||||
|
||||
|
||||
#if 0
|
||||
static int compare( const void* a1, const void* a2 )
|
||||
{
|
||||
const KEYWORD* k1 = (const KEYWORD*) a1;
|
||||
const KEYWORD* k2 = (const KEYWORD*) a2;
|
||||
|
||||
int ret = strcmp( k1->name, k2->name );
|
||||
return ret;
|
||||
}
|
||||
|
||||
int DSNLEXER::findToken( const std::string& tok )
|
||||
{
|
||||
// convert to lower case once, this should be faster than using strcasecmp()
|
||||
// for each test in compare().
|
||||
lowercase.clear();
|
||||
|
||||
for( std::string::const_iterator iter = tok.begin(); iter!=tok.end(); ++iter )
|
||||
lowercase += (char) tolower( *iter );
|
||||
|
||||
KEYWORD search;
|
||||
|
||||
search.name = lowercase.c_str();
|
||||
|
||||
// a boost hashtable might be a few percent faster, depending on
|
||||
// hashtable size and quality of the hash function.
|
||||
search.name = tok.c_str();
|
||||
|
||||
const KEYWORD* findings = (const KEYWORD*) bsearch( &search,
|
||||
keywords, keywordCount,
|
||||
|
@ -190,9 +196,21 @@ int DSNLEXER::findToken( const std::string& tok )
|
|||
if( findings )
|
||||
return findings->token;
|
||||
else
|
||||
return -1;
|
||||
return DSN_SYMBOL; // not a keyword, some arbitrary symbol.
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
inline int DSNLEXER::findToken( const std::string& tok )
|
||||
{
|
||||
KEYWORD_MAP::const_iterator it = keyword_hash.find( tok.c_str() );
|
||||
if( it != keyword_hash.end() )
|
||||
return it->second;
|
||||
|
||||
return DSN_SYMBOL; // not a keyword, some arbitrary symbol.
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
const char* DSNLEXER::Syntax( int aTok )
|
||||
{
|
||||
|
@ -281,25 +299,24 @@ bool DSNLEXER::IsSymbol( int aTok )
|
|||
|
||||
void DSNLEXER::Expecting( int aTok ) throw( IO_ERROR )
|
||||
{
|
||||
wxString errText;
|
||||
errText.Printf( _("Expecting '%s'"), GetChars( GetTokenString( aTok ) ) );
|
||||
wxString errText = wxString::Format(
|
||||
_("Expecting '%s'"), GetChars( GetTokenString( aTok ) ) );
|
||||
THROW_PARSE_ERROR( errText, CurSource(), CurLine(), CurLineNumber(), CurOffset() );
|
||||
}
|
||||
|
||||
|
||||
void DSNLEXER::Expecting( const char* text ) throw( IO_ERROR )
|
||||
{
|
||||
wxString errText;
|
||||
errText.Printf( _("Expecting '%s'"),
|
||||
GetChars( wxString::FromUTF8( text ) ) );
|
||||
wxString errText = wxString::Format(
|
||||
_("Expecting '%s'"), GetChars( wxString::FromUTF8( text ) ) );
|
||||
THROW_PARSE_ERROR( errText, CurSource(), CurLine(), CurLineNumber(), CurOffset() );
|
||||
}
|
||||
|
||||
|
||||
void DSNLEXER::Unexpected( int aTok ) throw( IO_ERROR )
|
||||
{
|
||||
wxString errText;
|
||||
errText.Printf( _("Unexpected '%s'"), GetChars( GetTokenString( aTok ) ) );
|
||||
wxString errText = wxString::Format(
|
||||
_("Unexpected '%s'"), GetChars( GetTokenString( aTok ) ) );
|
||||
THROW_PARSE_ERROR( errText, CurSource(), CurLine(), CurLineNumber(), CurOffset() );
|
||||
}
|
||||
|
||||
|
@ -314,9 +331,8 @@ void DSNLEXER::Duplicate( int aTok ) throw( IO_ERROR )
|
|||
|
||||
void DSNLEXER::Unexpected( const char* text ) throw( IO_ERROR )
|
||||
{
|
||||
wxString errText;
|
||||
errText.Printf( _("Unexpected '%s'"),
|
||||
GetChars( wxString::FromUTF8( text ) ) );
|
||||
wxString errText = wxString::Format(
|
||||
_("Unexpected '%s'"), GetChars( wxString::FromUTF8( text ) ) );
|
||||
THROW_PARSE_ERROR( errText, CurSource(), CurLine(), CurLineNumber(), CurOffset() );
|
||||
}
|
||||
|
||||
|
@ -414,11 +430,11 @@ inline bool isSep( char cc )
|
|||
* at the first non-number character, even if it is not whitespace.
|
||||
*
|
||||
* @param cp is the start of the current token.
|
||||
* @param limit is the end of the current line of text.
|
||||
* @return const char* - if initial text was a number, then pointer to the text
|
||||
* after this number, else NULL if initial text was not a number.
|
||||
* @param limit is the end of the current token.
|
||||
*
|
||||
* @return bool - true if input token is a number, else false.
|
||||
*/
|
||||
static const char* isNumber( const char* cp, const char* limit )
|
||||
static bool isNumber( const char* cp, const char* limit )
|
||||
{
|
||||
// regex for a float: "^[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?" i.e. any number,
|
||||
// code traversal manually here:
|
||||
|
@ -464,7 +480,7 @@ static const char* isNumber( const char* cp, const char* limit )
|
|||
}
|
||||
}
|
||||
|
||||
return sawNumber ? cp : NULL;
|
||||
return sawNumber && cp==limit;
|
||||
}
|
||||
|
||||
|
||||
|
@ -475,67 +491,179 @@ int DSNLEXER::NextTok() throw( IO_ERROR )
|
|||
|
||||
prevTok = curTok;
|
||||
|
||||
if( curTok != DSN_EOF )
|
||||
if( curTok == DSN_EOF )
|
||||
goto exit;
|
||||
|
||||
if( cur >= limit )
|
||||
{
|
||||
if( cur >= limit )
|
||||
{
|
||||
L_read:
|
||||
// blank lines are returned as "\n" and will have a len of 1.
|
||||
// EOF will have a len of 0 and so is detectable.
|
||||
int len = readLine();
|
||||
if( len == 0 )
|
||||
{
|
||||
cur = start; // after readLine(), since start can change, set cur offset to start
|
||||
curTok = DSN_EOF;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
cur = start; // after readLine() since start can change.
|
||||
|
||||
// skip leading whitespace
|
||||
while( cur<limit && isSpace( *cur ) )
|
||||
++cur;
|
||||
|
||||
// If the first non-blank character is #, this line is a comment.
|
||||
// Comments cannot follow any other token on the same line.
|
||||
if( cur<limit && *cur=='#' )
|
||||
{
|
||||
if( commentsAreTokens )
|
||||
{
|
||||
// save the entire line, including new line as the current token.
|
||||
// the '#' character may not be at offset zero.
|
||||
curText = start; // entire line is the token
|
||||
cur = start; // ensure a good curOffset below
|
||||
curTok = DSN_COMMENT;
|
||||
head = limit; // do a readLine() on next call in here.
|
||||
goto exit;
|
||||
}
|
||||
else
|
||||
goto L_read;
|
||||
}
|
||||
}
|
||||
else
|
||||
// blank lines are returned as "\n" and will have a len of 1.
|
||||
// EOF will have a len of 0 and so is detectable.
|
||||
int len = readLine();
|
||||
if( len == 0 )
|
||||
{
|
||||
// skip leading whitespace
|
||||
while( cur<limit && isSpace( *cur ) )
|
||||
++cur;
|
||||
}
|
||||
|
||||
if( cur >= limit )
|
||||
goto L_read;
|
||||
|
||||
if( *cur == '(' )
|
||||
{
|
||||
curText = *cur;
|
||||
curTok = DSN_LEFT;
|
||||
head = cur+1;
|
||||
cur = start; // after readLine(), since start can change, set cur offset to start
|
||||
curTok = DSN_EOF;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if( *cur == ')' )
|
||||
cur = start; // after readLine() since start can change.
|
||||
|
||||
// skip leading whitespace
|
||||
while( cur<limit && isSpace( *cur ) )
|
||||
++cur;
|
||||
|
||||
// If the first non-blank character is #, this line is a comment.
|
||||
// Comments cannot follow any other token on the same line.
|
||||
if( cur<limit && *cur=='#' )
|
||||
{
|
||||
curText = *cur;
|
||||
curTok = DSN_RIGHT;
|
||||
if( commentsAreTokens )
|
||||
{
|
||||
// Grab the entire current line [excluding end of line char(s)] as the
|
||||
// current token. The '#' character may not be at offset zero.
|
||||
|
||||
while( limit[-1] == '\n' || limit[-1] == '\r' )
|
||||
--limit;
|
||||
|
||||
curText.clear();
|
||||
curText.append( start, limit );
|
||||
|
||||
cur = start; // ensure a good curOffset below
|
||||
curTok = DSN_COMMENT;
|
||||
head = limit; // do a readLine() on next call in here.
|
||||
goto exit;
|
||||
}
|
||||
else
|
||||
goto L_read;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// skip leading whitespace
|
||||
while( cur<limit && isSpace( *cur ) )
|
||||
++cur;
|
||||
}
|
||||
|
||||
if( cur >= limit )
|
||||
goto L_read;
|
||||
|
||||
if( *cur == '(' )
|
||||
{
|
||||
curText = *cur;
|
||||
curTok = DSN_LEFT;
|
||||
head = cur+1;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if( *cur == ')' )
|
||||
{
|
||||
curText = *cur;
|
||||
curTok = DSN_RIGHT;
|
||||
head = cur+1;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
// Non-specctraMode, understands and deciphers escaped \, \r, \n, and \".
|
||||
// Strips off leading and trailing double quotes
|
||||
if( !specctraMode )
|
||||
{
|
||||
// a quoted string, will return DSN_STRING
|
||||
if( *cur == stringDelimiter )
|
||||
{
|
||||
// copy the token, character by character so we can remove doubled up quotes.
|
||||
curText.clear();
|
||||
|
||||
++cur; // skip over the leading delimiter, which is always " in non-specctraMode
|
||||
|
||||
head = cur;
|
||||
|
||||
while( head<limit )
|
||||
{
|
||||
// ESCAPE SEQUENCES:
|
||||
if( *head =='\\' )
|
||||
{
|
||||
char tbuf[8];
|
||||
char c;
|
||||
int i;
|
||||
|
||||
if( ++head >= limit )
|
||||
break; // throw exception at L_unterminated
|
||||
|
||||
switch( *head++ )
|
||||
{
|
||||
case '"':
|
||||
case '\\': c = head[-1]; break;
|
||||
case 'a': c = '\x07'; break;
|
||||
case 'b': c = '\x08'; break;
|
||||
case 'f': c = '\x0c'; break;
|
||||
case 'n': c = '\n'; break;
|
||||
case 'r': c = '\r'; break;
|
||||
case 't': c = '\x09'; break;
|
||||
case 'v': c = '\x0b'; break;
|
||||
|
||||
case 'x': // 1 or 2 byte hex escape sequence
|
||||
for( i=0; i<2; ++i )
|
||||
{
|
||||
if( !isxdigit( head[i] ) )
|
||||
break;
|
||||
tbuf[i] = head[i];
|
||||
}
|
||||
tbuf[i] = '\0';
|
||||
if( i > 0 )
|
||||
c = (char) strtoul( tbuf, NULL, 16 );
|
||||
else
|
||||
c = 'x'; // a goofed hex escape sequence, interpret as 'x'
|
||||
head += i;
|
||||
break;
|
||||
|
||||
default: // 1-3 byte octal escape sequence
|
||||
--head;
|
||||
for( i=0; i<3; ++i )
|
||||
{
|
||||
if( head[i] < '0' || head[i] > '7' )
|
||||
break;
|
||||
tbuf[i] = head[i];
|
||||
}
|
||||
tbuf[i] = '\0';
|
||||
if( i > 0 )
|
||||
c = (char) strtoul( tbuf, NULL, 8 );
|
||||
else
|
||||
c = '\\'; // a goofed octal escape sequence, interpret as '\'
|
||||
head += i;
|
||||
break;
|
||||
}
|
||||
|
||||
curText += c;
|
||||
}
|
||||
|
||||
else if( *head == '"' ) // end of the non-specctraMode DSN_STRING
|
||||
{
|
||||
curTok = DSN_STRING;
|
||||
++head; // omit this trailing double quote
|
||||
goto exit;
|
||||
}
|
||||
|
||||
else
|
||||
curText += *head++;
|
||||
|
||||
} // while
|
||||
|
||||
// L_unterminated:
|
||||
wxString errtxt( _( "Un-terminated delimited string" ) );
|
||||
THROW_PARSE_ERROR( errtxt, CurSource(), CurLine(), CurLineNumber(), CurOffset() );
|
||||
}
|
||||
}
|
||||
|
||||
else // is specctraMode, tests in this block should not occur in KiCad mode.
|
||||
{
|
||||
/* get the dash out of a <pin_reference> which is embedded for example
|
||||
like: U2-14 or "U2"-"14"
|
||||
This is detectable by a non-space immediately preceeding the dash.
|
||||
*/
|
||||
if( *cur == '-' && cur>start && !isSpace( cur[-1] ) )
|
||||
{
|
||||
curText = '-';
|
||||
curTok = DSN_DASH;
|
||||
head = cur+1;
|
||||
goto exit;
|
||||
}
|
||||
|
@ -569,166 +697,53 @@ L_read:
|
|||
goto exit;
|
||||
}
|
||||
|
||||
/* get the dash out of a <pin_reference> which is embedded for example
|
||||
like: U2-14 or "U2"-"14"
|
||||
This is detectable by a non-space immediately preceeding the dash.
|
||||
*/
|
||||
if( *cur == '-' && cur>start && !isSpace( cur[-1] ) )
|
||||
{
|
||||
curText = '-';
|
||||
curTok = DSN_DASH;
|
||||
head = cur+1;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if( ( head = isNumber( cur, limit ) ) != NULL &&
|
||||
// token can only be a number if trailing text is a separator or line end
|
||||
( head==limit || isSep( *head ) ) )
|
||||
{
|
||||
curText.clear();
|
||||
curText.append( cur, head );
|
||||
curTok = DSN_NUMBER;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
// a quoted string, will return DSN_STRING
|
||||
// specctraMode DSN_STRING
|
||||
if( *cur == stringDelimiter )
|
||||
{
|
||||
// Non-specctraMode, understands and deciphers escaped \, \r, \n, and \".
|
||||
// Strips off leading and trailing double quotes
|
||||
if( !specctraMode )
|
||||
++cur; // skip over the leading delimiter: ",', or $
|
||||
|
||||
head = cur;
|
||||
|
||||
while( head<limit && !isStringTerminator( *head ) )
|
||||
++head;
|
||||
|
||||
if( head >= limit )
|
||||
{
|
||||
// copy the token, character by character so we can remove doubled up quotes.
|
||||
curText.clear();
|
||||
|
||||
++cur; // skip over the leading delimiter, which is always " in non-specctraMode
|
||||
|
||||
head = cur;
|
||||
|
||||
while( head<limit )
|
||||
{
|
||||
// ESCAPE SEQUENCES:
|
||||
if( *head =='\\' )
|
||||
{
|
||||
char tbuf[8];
|
||||
char c;
|
||||
int i;
|
||||
|
||||
if( ++head >= limit )
|
||||
break; // throw exception at L_unterminated
|
||||
|
||||
switch( *head++ )
|
||||
{
|
||||
case '"':
|
||||
case '\\': c = head[-1]; break;
|
||||
case 'a': c = '\x07'; break;
|
||||
case 'b': c = '\x08'; break;
|
||||
case 'f': c = '\x0c'; break;
|
||||
case 'n': c = '\n'; break;
|
||||
case 'r': c = '\r'; break;
|
||||
case 't': c = '\x09'; break;
|
||||
case 'v': c = '\x0b'; break;
|
||||
|
||||
case 'x': // 1 or 2 byte hex escape sequence
|
||||
for( i=0; i<2; ++i )
|
||||
{
|
||||
if( !isxdigit( head[i] ) )
|
||||
break;
|
||||
tbuf[i] = head[i];
|
||||
}
|
||||
tbuf[i] = '\0';
|
||||
if( i > 0 )
|
||||
c = (char) strtoul( tbuf, NULL, 16 );
|
||||
else
|
||||
c = 'x'; // a goofed hex escape sequence, interpret as 'x'
|
||||
head += i;
|
||||
break;
|
||||
|
||||
default: // 1-3 byte octal escape sequence
|
||||
--head;
|
||||
for( i=0; i<3; ++i )
|
||||
{
|
||||
if( head[i] < '0' || head[i] > '7' )
|
||||
break;
|
||||
tbuf[i] = head[i];
|
||||
}
|
||||
tbuf[i] = '\0';
|
||||
if( i > 0 )
|
||||
c = (char) strtoul( tbuf, NULL, 8 );
|
||||
else
|
||||
c = '\\'; // a goofed octal escape sequence, interpret as '\'
|
||||
head += i;
|
||||
break;
|
||||
}
|
||||
|
||||
curText += c;
|
||||
}
|
||||
|
||||
else if( *head == '"' ) // end of the non-specctraMode DSN_STRING
|
||||
{
|
||||
curTok = DSN_STRING;
|
||||
++head; // omit this trailing double quote
|
||||
goto exit;
|
||||
}
|
||||
|
||||
else
|
||||
curText += *head++;
|
||||
|
||||
} // while
|
||||
|
||||
// L_unterminated:
|
||||
wxString errtxt( _( "Un-terminated delimited string" ) );
|
||||
THROW_PARSE_ERROR( errtxt, CurSource(), CurLine(), CurLineNumber(), CurOffset() );
|
||||
}
|
||||
|
||||
else // specctraMode DSN_STRING
|
||||
{
|
||||
++cur; // skip over the leading delimiter: ",', or $
|
||||
|
||||
head = cur;
|
||||
|
||||
while( head<limit && !isStringTerminator( *head ) )
|
||||
++head;
|
||||
|
||||
if( head >= limit )
|
||||
{
|
||||
wxString errtxt( _( "Un-terminated delimited string" ) );
|
||||
THROW_PARSE_ERROR( errtxt, CurSource(), CurLine(), CurLineNumber(), CurOffset() );
|
||||
}
|
||||
|
||||
curText.clear();
|
||||
curText.append( cur, head );
|
||||
|
||||
++head; // skip over the trailing delimiter
|
||||
|
||||
curTok = DSN_STRING;
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
|
||||
// Maybe it is a token we will find in the token table.
|
||||
// If not, then call it a DSN_SYMBOL.
|
||||
{
|
||||
head = cur+1;
|
||||
while( head<limit && !isSep( *head ) )
|
||||
++head;
|
||||
|
||||
curText.clear();
|
||||
curText.append( cur, head );
|
||||
|
||||
int found = findToken( curText );
|
||||
++head; // skip over the trailing delimiter
|
||||
|
||||
if( found != -1 )
|
||||
curTok = found;
|
||||
|
||||
else if( 0 == curText.compare( "string_quote" ) )
|
||||
curTok = DSN_STRING_QUOTE;
|
||||
|
||||
else // unrecogized token, call it a symbol
|
||||
curTok = DSN_SYMBOL;
|
||||
curTok = DSN_STRING;
|
||||
goto exit;
|
||||
}
|
||||
} // specctraMode
|
||||
|
||||
// non-quoted token, read it into curText.
|
||||
curText.clear();
|
||||
|
||||
head = cur;
|
||||
while( head<limit && !isSep( *head ) )
|
||||
curText += *head++;
|
||||
|
||||
if( isNumber( curText.c_str(), curText.c_str() + curText.size() ) )
|
||||
{
|
||||
curTok = DSN_NUMBER;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if( specctraMode && curText == "string_quote" )
|
||||
{
|
||||
curTok = DSN_STRING_QUOTE;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
curTok = findToken( curText );
|
||||
|
||||
exit: // single point of exit, no returns elsewhere please.
|
||||
|
||||
curOffset = cur - start;
|
||||
|
@ -739,3 +754,25 @@ exit: // single point of exit, no returns elsewhere please.
|
|||
return curTok;
|
||||
}
|
||||
|
||||
|
||||
wxArrayString* DSNLEXER::ReadCommentLines() throw( IO_ERROR )
|
||||
{
|
||||
wxArrayString* ret = 0;
|
||||
bool cmt_setting = SetCommentsAreTokens( true );
|
||||
int tok = NextTok();
|
||||
|
||||
if( tok == DSN_COMMENT )
|
||||
{
|
||||
ret = new wxArrayString();
|
||||
|
||||
do
|
||||
{
|
||||
ret->Add( FromUTF8() );
|
||||
}
|
||||
while( ( tok = NextTok() ) == DSN_COMMENT );
|
||||
}
|
||||
|
||||
SetCommentsAreTokens( cmt_setting );
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -35,10 +35,13 @@
|
|||
|
||||
// Conversion to application internal units defined at build time.
|
||||
#if defined( PCBNEW )
|
||||
#include <class_board_item.h>
|
||||
#include <class_board_item.h>
|
||||
#elif defined( EESCHEMA )
|
||||
#include <sch_item_struct.h>
|
||||
#include <sch_item_struct.h>
|
||||
#elif defined( GERBVIEW )
|
||||
#elif defined( PL_EDITOR )
|
||||
#include <base_units.h>
|
||||
#define FMT_IU Double2Str
|
||||
#else
|
||||
#error "Cannot resolve units formatting due to no definition of EESCHEMA or PCBNEW."
|
||||
#endif
|
||||
|
@ -212,7 +215,7 @@ bool EDA_TEXT::TextHitTest( const EDA_RECT& aRect, bool aContains, int aAccuracy
|
|||
}
|
||||
|
||||
|
||||
void EDA_TEXT::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aOffset,
|
||||
void EDA_TEXT::Draw( EDA_RECT* aClipBox, wxDC* aDC, const wxPoint& aOffset,
|
||||
EDA_COLOR_T aColor, GR_DRAWMODE aDrawMode,
|
||||
EDA_DRAW_MODE_T aFillMode, EDA_COLOR_T aAnchor_color )
|
||||
{
|
||||
|
@ -229,34 +232,23 @@ void EDA_TEXT::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aOffset,
|
|||
for( unsigned i = 0; i<list->Count(); i++ )
|
||||
{
|
||||
wxString txt = list->Item( i );
|
||||
DrawOneLineOfText( aPanel,
|
||||
aDC,
|
||||
aOffset,
|
||||
aColor,
|
||||
aDrawMode,
|
||||
aFillMode,
|
||||
drawOneLineOfText( aClipBox, aDC, aOffset, aColor,
|
||||
aDrawMode, aFillMode,
|
||||
i ? UNSPECIFIED_COLOR : aAnchor_color,
|
||||
txt,
|
||||
pos );
|
||||
txt, pos );
|
||||
pos += offset;
|
||||
}
|
||||
|
||||
delete (list);
|
||||
}
|
||||
else
|
||||
DrawOneLineOfText( aPanel,
|
||||
aDC,
|
||||
aOffset,
|
||||
aColor,
|
||||
aDrawMode,
|
||||
aFillMode,
|
||||
aAnchor_color,
|
||||
m_Text,
|
||||
m_Pos );
|
||||
drawOneLineOfText( aClipBox, aDC, aOffset, aColor,
|
||||
aDrawMode, aFillMode,
|
||||
aAnchor_color, m_Text, m_Pos );
|
||||
}
|
||||
|
||||
|
||||
void EDA_TEXT::DrawOneLineOfText( EDA_DRAW_PANEL* aPanel, wxDC* aDC,
|
||||
void EDA_TEXT::drawOneLineOfText( EDA_RECT* aClipBox, wxDC* aDC,
|
||||
const wxPoint& aOffset, EDA_COLOR_T aColor,
|
||||
GR_DRAWMODE aDrawMode, EDA_DRAW_MODE_T aFillMode,
|
||||
EDA_COLOR_T aAnchor_color,
|
||||
|
@ -273,7 +265,7 @@ void EDA_TEXT::DrawOneLineOfText( EDA_DRAW_PANEL* aPanel, wxDC* aDC,
|
|||
// Draw text anchor, if requested
|
||||
if( aAnchor_color != UNSPECIFIED_COLOR )
|
||||
{
|
||||
GRDrawAnchor( aPanel->GetClipBox(), aDC,
|
||||
GRDrawAnchor( aClipBox, aDC,
|
||||
aPos.x + aOffset.x, aPos.y + aOffset.y,
|
||||
DIM_ANCRE_TEXTE, aAnchor_color );
|
||||
}
|
||||
|
@ -286,7 +278,7 @@ void EDA_TEXT::DrawOneLineOfText( EDA_DRAW_PANEL* aPanel, wxDC* aDC,
|
|||
if( m_Mirror )
|
||||
size.x = -size.x;
|
||||
|
||||
DrawGraphicText( aPanel, aDC, aOffset + aPos, aColor, aText, m_Orient, size,
|
||||
DrawGraphicText( aClipBox, aDC, aOffset + aPos, aColor, aText, m_Orient, size,
|
||||
m_HJustify, m_VJustify, width, m_Italic, m_Bold );
|
||||
}
|
||||
|
||||
|
|
|
@ -99,7 +99,7 @@ bool FOOTPRINT_LIST::ReadFootprintFiles( wxArrayString& aFootprintsLibNames )
|
|||
fpinfo->SetLibraryName( filename.GetName() );
|
||||
fpinfo->SetLibraryPath( filename.GetFullPath() );
|
||||
fpinfo->m_Module = fpnames[i];
|
||||
fpinfo->m_padCount = m->GetPadCount();
|
||||
fpinfo->m_padCount = m->GetPadCount( MODULE::DO_NOT_INCLUDE_NPTH );
|
||||
fpinfo->m_KeyWord = m->GetKeywords();
|
||||
fpinfo->m_Doc = m->GetDescription();
|
||||
|
||||
|
@ -163,7 +163,7 @@ bool FOOTPRINT_LIST::ReadFootprintFiles( FP_LIB_TABLE& aTable )
|
|||
fpinfo->SetLibraryName( libNickNames[ii] );
|
||||
fpinfo->SetLibraryPath( path );
|
||||
fpinfo->m_Module = fpnames[i];
|
||||
fpinfo->m_padCount = m->GetPadCount();
|
||||
fpinfo->m_padCount = m->GetPadCount( MODULE::DO_NOT_INCLUDE_NPTH );
|
||||
fpinfo->m_KeyWord = m->GetKeywords();
|
||||
fpinfo->m_Doc = m->GetDescription();
|
||||
|
||||
|
@ -180,3 +180,26 @@ bool FOOTPRINT_LIST::ReadFootprintFiles( FP_LIB_TABLE& aTable )
|
|||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool FOOTPRINT_INFO::InLibrary( const wxString& aLibrary ) const
|
||||
{
|
||||
if( aLibrary.IsEmpty() )
|
||||
return false;
|
||||
|
||||
if( aLibrary == m_libName || aLibrary == m_libPath )
|
||||
return true;
|
||||
|
||||
wxFileName filename = aLibrary;
|
||||
|
||||
if( filename.GetExt().IsEmpty() )
|
||||
filename.SetExt( LegacyFootprintLibPathExtension );
|
||||
|
||||
if( filename.GetFullPath() == m_libPath )
|
||||
return true;
|
||||
|
||||
if( filename.GetPath().IsEmpty() )
|
||||
filename = wxGetApp().FindLibraryPath( filename.GetFullName() );
|
||||
|
||||
return filename.GetFullPath() == m_libPath;
|
||||
}
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include <common.h>
|
||||
|
||||
#if defined(_WIN32)
|
||||
|
||||
|
|
|
@ -519,6 +519,7 @@ int EDA_BASE_FRAME::WriteHotkeyConfig( struct EDA_HOTKEY_CONFIG* aDescList,
|
|||
if( file )
|
||||
{
|
||||
fputs( TO_UTF8( msg ), file );
|
||||
fclose( file );
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -6,8 +6,8 @@ HTML_MESSAGE_BOX::HTML_MESSAGE_BOX( wxWindow* parent, const wxString & aTitle,
|
|||
wxPoint aPos, wxSize aSize)
|
||||
: DIALOG_DISPLAY_HTML_TEXT_BASE( parent, wxID_ANY, aTitle, aPos, aSize )
|
||||
{
|
||||
SetFocus();
|
||||
ListClear();
|
||||
Center();
|
||||
}
|
||||
|
||||
void HTML_MESSAGE_BOX::OnCloseButtonClick( wxCommandEvent& event )
|
||||
|
|
|
@ -0,0 +1,198 @@
|
|||
/**
|
||||
* @file page_layout_default_description.cpp
|
||||
*/
|
||||
|
||||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 1992-2013 Jean-Pierre Charras <jp.charras at wanadoo.fr>.
|
||||
* Copyright (C) 1992-2013 KiCad Developers, see change_log.txt for contributors.
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
/* keyword used in page layout description are (see page_layout_reader.keywords)
|
||||
* page_layout
|
||||
* setup
|
||||
* linewidth
|
||||
* textlinewidth
|
||||
* textsize
|
||||
* comment
|
||||
* line
|
||||
* rect
|
||||
* polygon
|
||||
* tbtext
|
||||
* ltcorner
|
||||
* lbcorner
|
||||
* rbcorner
|
||||
* rtcorner
|
||||
* name
|
||||
* pos
|
||||
* start
|
||||
* end
|
||||
* pts
|
||||
* xy
|
||||
* maxlen
|
||||
* maxheight
|
||||
* font
|
||||
* bold
|
||||
* italic
|
||||
* size
|
||||
* justify
|
||||
* left
|
||||
* center
|
||||
* right
|
||||
* top
|
||||
* bottom
|
||||
* rotate
|
||||
* repeat
|
||||
* incrx
|
||||
* incry
|
||||
* incrlabel
|
||||
*/
|
||||
/*
|
||||
* Items use coordinates.
|
||||
* A coordinate is defined relative to a page corner
|
||||
* A coordinate is the X pos, the Y pos, and the corner which is the coordinate origin
|
||||
* the default is the bottom right corner
|
||||
* example: (start 10 0 ltcorner) or (start 20 10)
|
||||
* The direction depends on the corner: a positive coordinate define a point
|
||||
* from the corner origin, to the opposite corner.
|
||||
*
|
||||
* Items are defined by a name, coordinates in mm and some attributes,
|
||||
* and can be repeated.
|
||||
* for instance (repeat 2) (incrx 2) (incry 2) repeat the item 2 times,
|
||||
* and coordinates are incremented by 2 on X direction, and 2 on Y direction
|
||||
* Comments are allowed. they are inside (), and start by the keyword comment
|
||||
* example:
|
||||
* (comment rect around the title block)
|
||||
*
|
||||
* Lines and rect are defined by 2 coordinates start and end, and attributes.
|
||||
* Attributes are linewidth and repeat parameters.
|
||||
* example:
|
||||
* (line (start 50 2 ltcorner) (end 50 0 ltcorner) (repeat 30) (incrx 50) )
|
||||
* (rect (comment rect around the title block) (linewidth 0.15) (start 110 34) (end 2 2) )
|
||||
*
|
||||
* Texts are defined by the text (between quotes), the position, and attributes
|
||||
* example
|
||||
* "(tbtext \"1\" (pos 25 1 lbcorner) (font (size 1.3 1.3)) (repeat 100) (incrx 50) )"
|
||||
* the text can be rotated by (rotation <value>) with value = rot angle in degrees
|
||||
* (font (size 1.3 1.3) bold italic) defines a specific size,
|
||||
* with bold and italic options
|
||||
* (justify <justif keyword>) controls the text justification (the default is left)
|
||||
* justif keyword is center, left, right, top and bottom
|
||||
* (justify center top) is a text centered on X axis and top aligned on vertical axis
|
||||
* The text size can be constrained:
|
||||
* (maxlen <value>) and (maxheight <value>) force the actual text x and/or y size to be
|
||||
* reduced to limit the text height to the maxheight value,
|
||||
* and the full text x size to the maxlen value.
|
||||
* If the actual text size is smaller than limits, its size is not modified.
|
||||
*
|
||||
* Texts can include a format symbol, a la printf.
|
||||
* At run time these format symbols will be replaced by their actual value.
|
||||
*
|
||||
* format symbols are:
|
||||
*
|
||||
* %% = replaced by %
|
||||
* %K = Kicad version
|
||||
* %Z = paper format name (A4, USLetter ...)
|
||||
* %Y = company name
|
||||
* %D = date
|
||||
* %R = revision
|
||||
* %S = sheet number
|
||||
* %N = number of sheets
|
||||
* %Cx = comment (x = 0 to 9 to identify the comment)
|
||||
* %F = filename
|
||||
* %P = sheet path (sheet full name)
|
||||
* %T = title
|
||||
*
|
||||
* example:
|
||||
* (tbtext \"Size: %Z\" ...) displays "Size A4" or Size USLetter"
|
||||
*
|
||||
* Poly Polygons
|
||||
* Set of filled polygons are supported.
|
||||
*
|
||||
* The main purpose is to allow logos, or complex shapes
|
||||
* They support the repeat and rotation options
|
||||
* They are defined by
|
||||
* (polygon (position ..) <rotation> <linewidth>
|
||||
* the parameter linewidth defines the pen size used to draw/plot
|
||||
* the polygon outlines (default = 0)
|
||||
* example:
|
||||
* (polygon (pos 134 18 rbcorner) (rotate 20) (linewidth 0.00254)
|
||||
*
|
||||
* and a list of corners like
|
||||
* (pts (xy 20.574 8.382) (xy 19.9009 8.382) (xy 19.9009 6.26364) (xy 19.7485 5.98932)
|
||||
* .... )
|
||||
*
|
||||
* each sequence like
|
||||
* (pts (xy 20.574 8.382) (xy 19.9009 8.382) (xy 19.9009 6.26364) (xy 19.7485 5.98932)
|
||||
* .... )
|
||||
* defines a polygon.
|
||||
* Each coordinate is relative to the polygon position.
|
||||
* Therefore a "polygon" is in fact a set of polygons, of a poly polygon
|
||||
*
|
||||
*/
|
||||
|
||||
#include <worksheet.h> // defaultPageLayout
|
||||
|
||||
|
||||
// height of the band reference grid 2.0 mm
|
||||
// worksheet frame reference text size 1.3 mm
|
||||
// default text size 1.5 mm
|
||||
// default line width 0.15 mm
|
||||
// frame ref pitch 50 mm
|
||||
|
||||
// export defaultPageLayout:
|
||||
extern const char defaultPageLayout[];
|
||||
|
||||
// Default page layout (sizes are in mm)
|
||||
const char defaultPageLayout[] = "( page_layout\n"
|
||||
"(setup (textsize 1.5 1.5) (linewidth 0.15) (textlinewidth 0.15) )"
|
||||
"(rect (comment \"rect around the title block\") (linewidth 0.15) (start 110 34) (end 2 2) )\n"
|
||||
"(rect (start 0 0 ltcorner) (end 0 0 rbcorner) (repeat 2) (incrx 2) (incry 2) )\n"
|
||||
"(line (start 50 2 ltcorner) (end 50 0 ltcorner) (repeat 30) (incrx 50) )\n"
|
||||
"(tbtext \"1\" (pos 25 1 ltcorner) (font (size 1.3 1.3))(repeat 100) (incrx 50) )\n"
|
||||
"(line (start 50 2 lbcorner) (end 50 0 lbcorner) (repeat 30) (incrx 50) )\n"
|
||||
"(tbtext \"1\" (pos 25 1 lbcorner) (font (size 1.3 1.3)) (repeat 100) (incrx 50) )\n"
|
||||
"(line (start 0 50 ltcorner) (end 2 50 ltcorner) (repeat 30) (incry 50) )\n"
|
||||
"(tbtext \"A\" (pos 1 25 ltcorner) (font (size 1.3 1.3)) (justify center)(repeat 100) (incry 50) )\n"
|
||||
"(line (start 0 50 rtcorner) (end 2 50 rtcorner) (repeat 30) (incry 50) )\n"
|
||||
"(tbtext \"A\" (pos 1 25 rtcorner) (font (size 1.3 1.3)) (justify center) (repeat 100) (incry 50) )\n"
|
||||
"(tbtext \"Date: %D\" (pos 87 6.9) )\n"
|
||||
"(line (start 110 5.5) end 2 5.5) )\n"
|
||||
"(tbtext \"%K\" (pos 109 4.1) (comment \"Kicad version\" ) )\n"
|
||||
"(line (start 110 8.5) end 2 8.5) )\n"
|
||||
"(tbtext \"Rev: %R\" (pos 24 6.9)(font bold)(justify left) )\n"
|
||||
"(tbtext \"Size: %Z\" (comment \"Paper format name\")(pos 109 6.9) )\n"
|
||||
"(tbtext \"Id: %S/%N\" (comment \"Sheet id\")(pos 24 4.1) )\n"
|
||||
"(line (start 110 12.5) end 2 12.5) )\n"
|
||||
"(tbtext \"Title: %T\" (pos 109 10.7)(font bold italic (size 2 2)) )\n"
|
||||
"(tbtext \"File: %F\" (pos 109 14.3) )\n"
|
||||
"(line (start 110 18.5) end 2 18.5) )\n"
|
||||
"(tbtext \"Sheet: %P\" (pos 109 17) )\n"
|
||||
"(tbtext \"%Y\" (comment \"Company name\") (pos 109 20)(font bold) )\n"
|
||||
"(tbtext \"%C0\" (comment \"Comment 0\") (pos 109 23) )\n"
|
||||
"(tbtext \"%C1\" (comment \"Comment 1\") (pos 109 26) )\n"
|
||||
"(tbtext \"%C2\" (comment \"Comment 2\") (pos 109 29) )\n"
|
||||
"(tbtext \"%C3\" (comment \"Comment 3\") (pos 109 32) )\n"
|
||||
"(line (start 90 8.5) end 90 5.5) )\n"
|
||||
"(line (start 26 8.5) end 26 2) )\n"
|
||||
")\n"
|
||||
;
|
|
@ -0,0 +1,623 @@
|
|||
/**
|
||||
* @file page_layout_reader.cpp
|
||||
* @brief read an S expression of description of graphic items and texts
|
||||
* to build a title block and page layout
|
||||
*/
|
||||
|
||||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 1992-2013 Jean-Pierre Charras <jp.charras at wanadoo.fr>.
|
||||
* Copyright (C) 1992-2013 KiCad Developers, see change_log.txt for contributors.
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include <fctsys.h>
|
||||
#include <base_struct.h>
|
||||
#include <worksheet.h>
|
||||
#include <worksheet_shape_builder.h>
|
||||
#include <math/vector2d.h>
|
||||
#include <page_layout_reader_lexer.h>
|
||||
|
||||
|
||||
using namespace TB_READER_T;
|
||||
|
||||
/**
|
||||
* Class PAGE_LAYOUT_READER_PARSER
|
||||
* holds data and functions pertinent to parsing a S-expression file
|
||||
* for a WORKSHEET_LAYOUT.
|
||||
*/
|
||||
class PAGE_LAYOUT_READER_PARSER : public PAGE_LAYOUT_READER_LEXER
|
||||
{
|
||||
DSIZE m_defaultTextSize; // Default text size, when not defined inside a tbtext
|
||||
double m_defaultLineWidth;
|
||||
double m_defaulTextLineWidth;
|
||||
|
||||
public:
|
||||
PAGE_LAYOUT_READER_PARSER( const char* aLine, const wxString& aSource );
|
||||
void Parse( WORKSHEET_LAYOUT* aLayout )
|
||||
throw( PARSE_ERROR, IO_ERROR );
|
||||
|
||||
private:
|
||||
|
||||
/**
|
||||
* Function parseInt
|
||||
* parses an integer and constrains it between two values.
|
||||
* @param aMin is the smallest return value.
|
||||
* @param aMax is the largest return value.
|
||||
* @return int - the parsed integer.
|
||||
*/
|
||||
int parseInt( int aMin, int aMax );
|
||||
|
||||
/**
|
||||
* Function parseDouble
|
||||
* parses a double
|
||||
* @return double - the parsed double.
|
||||
*/
|
||||
double parseDouble();
|
||||
|
||||
void parseSetup() throw( IO_ERROR, PARSE_ERROR );
|
||||
void parseGraphic( WORKSHEET_DATAITEM * aItem ) throw( IO_ERROR, PARSE_ERROR );
|
||||
void parseText( WORKSHEET_DATAITEM_TEXT * aItem ) throw( IO_ERROR, PARSE_ERROR );
|
||||
void parsePolygon( WORKSHEET_DATAITEM_POLYPOLYGON * aItem )
|
||||
throw( IO_ERROR, PARSE_ERROR );
|
||||
void parsePolyOutline( WORKSHEET_DATAITEM_POLYPOLYGON * aItem )
|
||||
throw( IO_ERROR, PARSE_ERROR );
|
||||
void parseCoordinate( POINT_COORD& aCoord) throw( IO_ERROR, PARSE_ERROR );
|
||||
};
|
||||
|
||||
// PCB_PLOT_PARAMS_PARSER
|
||||
|
||||
PAGE_LAYOUT_READER_PARSER::PAGE_LAYOUT_READER_PARSER( const char* aLine, const wxString& aSource ) :
|
||||
PAGE_LAYOUT_READER_LEXER( aLine, aSource )
|
||||
{
|
||||
m_defaultTextSize.x = m_defaultTextSize.y = TB_DEFAULT_TEXTSIZE;
|
||||
m_defaultLineWidth = 0.0;
|
||||
m_defaulTextLineWidth = 0.0;
|
||||
}
|
||||
|
||||
|
||||
void PAGE_LAYOUT_READER_PARSER::Parse( WORKSHEET_LAYOUT* aLayout )
|
||||
throw( PARSE_ERROR, IO_ERROR )
|
||||
{
|
||||
T token;
|
||||
WORKSHEET_DATAITEM * item;
|
||||
|
||||
LOCALE_IO toggle;
|
||||
|
||||
while( ( token = NextTok() ) != T_RIGHT )
|
||||
{
|
||||
if( token == T_EOF)
|
||||
break;
|
||||
|
||||
if( token == T_LEFT )
|
||||
token = NextTok();
|
||||
|
||||
if( token == T_page_layout )
|
||||
continue;
|
||||
|
||||
switch( token )
|
||||
{
|
||||
case T_setup: // Defines default values for graphic items
|
||||
parseSetup();
|
||||
break;
|
||||
|
||||
case T_line:
|
||||
item = new WORKSHEET_DATAITEM( WORKSHEET_DATAITEM::WS_SEGMENT );
|
||||
parseGraphic( item );
|
||||
aLayout->Append( item );
|
||||
break;
|
||||
|
||||
case T_rect:
|
||||
item = new WORKSHEET_DATAITEM( WORKSHEET_DATAITEM::WS_RECT );
|
||||
parseGraphic( item );
|
||||
aLayout->Append( item );
|
||||
break;
|
||||
|
||||
case T_polygon:
|
||||
item = new WORKSHEET_DATAITEM_POLYPOLYGON();
|
||||
parsePolygon( (WORKSHEET_DATAITEM_POLYPOLYGON*) item );
|
||||
aLayout->Append( item );
|
||||
break;
|
||||
|
||||
case T_tbtext:
|
||||
NeedSYMBOLorNUMBER();
|
||||
item = new WORKSHEET_DATAITEM_TEXT( FromUTF8() );
|
||||
parseText( (WORKSHEET_DATAITEM_TEXT*) item );
|
||||
aLayout->Append( item );
|
||||
break;
|
||||
|
||||
default:
|
||||
Unexpected( CurText() );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PAGE_LAYOUT_READER_PARSER::parseSetup() throw( IO_ERROR, PARSE_ERROR )
|
||||
{
|
||||
T token;
|
||||
while( ( token = NextTok() ) != T_RIGHT )
|
||||
{
|
||||
if( token == T_EOF)
|
||||
break;
|
||||
|
||||
switch( token )
|
||||
{
|
||||
case T_LEFT:
|
||||
break;
|
||||
|
||||
case T_linewidth:
|
||||
m_defaultLineWidth = parseDouble();
|
||||
NeedRIGHT();
|
||||
break;
|
||||
|
||||
case T_textsize:
|
||||
m_defaultTextSize.x = parseDouble();
|
||||
m_defaultTextSize.y = parseDouble();
|
||||
NeedRIGHT();
|
||||
break;
|
||||
|
||||
case T_textlinewidth:
|
||||
m_defaulTextLineWidth = parseDouble();
|
||||
NeedRIGHT();
|
||||
break;
|
||||
|
||||
default:
|
||||
Unexpected( CurText() );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PAGE_LAYOUT_READER_PARSER::parsePolygon( WORKSHEET_DATAITEM_POLYPOLYGON * aItem )
|
||||
throw( IO_ERROR, PARSE_ERROR )
|
||||
{
|
||||
aItem->m_LineWidth = 0;
|
||||
|
||||
T token;
|
||||
|
||||
while( ( token = NextTok() ) != T_RIGHT )
|
||||
{
|
||||
if( token == T_EOF)
|
||||
break;
|
||||
|
||||
if( token == T_LEFT )
|
||||
token = NextTok();
|
||||
|
||||
switch( token )
|
||||
{
|
||||
case T_comment: // Comment, search the closing ')'
|
||||
while( ( token = NextTok() ) != T_RIGHT && token != T_EOF );
|
||||
break;
|
||||
|
||||
case T_pos:
|
||||
parseCoordinate( aItem->m_Pos );
|
||||
break;
|
||||
|
||||
case T_pts:
|
||||
parsePolyOutline( aItem );
|
||||
aItem->CloseContour();
|
||||
break;
|
||||
|
||||
case T_rotate:
|
||||
aItem->m_Orient = parseDouble();
|
||||
NeedRIGHT();
|
||||
break;
|
||||
|
||||
case T_repeat:
|
||||
aItem->m_RepeatCount = parseInt( -1, 100 );
|
||||
NeedRIGHT();
|
||||
break;
|
||||
|
||||
case T_incrx:
|
||||
aItem->m_IncrementVector.x = parseDouble();
|
||||
NeedRIGHT();
|
||||
break;
|
||||
|
||||
case T_incry:
|
||||
aItem->m_IncrementVector.y = parseDouble();
|
||||
NeedRIGHT();
|
||||
break;
|
||||
|
||||
case T_linewidth:
|
||||
aItem->m_LineWidth = parseDouble();
|
||||
NeedRIGHT();
|
||||
break;
|
||||
|
||||
default:
|
||||
Unexpected( CurText() );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
aItem->SetBoundingBox();
|
||||
}
|
||||
|
||||
void PAGE_LAYOUT_READER_PARSER::parsePolyOutline( WORKSHEET_DATAITEM_POLYPOLYGON * aItem )
|
||||
throw( IO_ERROR, PARSE_ERROR )
|
||||
{
|
||||
DPOINT corner;
|
||||
T token;
|
||||
|
||||
while( ( token = NextTok() ) != T_RIGHT )
|
||||
{
|
||||
if( token == T_EOF)
|
||||
break;
|
||||
|
||||
if( token == T_LEFT )
|
||||
token = NextTok();
|
||||
|
||||
switch( token )
|
||||
{
|
||||
case T_xy:
|
||||
corner.x = parseDouble();
|
||||
corner.y = parseDouble();
|
||||
aItem->AppendCorner( corner );
|
||||
NeedRIGHT();
|
||||
break;
|
||||
|
||||
default:
|
||||
Unexpected( CurText() );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PAGE_LAYOUT_READER_PARSER::parseGraphic( WORKSHEET_DATAITEM * aItem )
|
||||
throw( IO_ERROR, PARSE_ERROR )
|
||||
{
|
||||
T token;
|
||||
|
||||
aItem->m_LineWidth = m_defaultLineWidth;
|
||||
|
||||
while( ( token = NextTok() ) != T_RIGHT )
|
||||
{
|
||||
if( token == T_EOF)
|
||||
break;
|
||||
|
||||
if( token == T_LEFT )
|
||||
token = NextTok();
|
||||
|
||||
switch( token )
|
||||
{
|
||||
case T_comment: // Comment, search the closing ')'
|
||||
while( ( token = NextTok() ) != T_RIGHT && token != T_EOF );
|
||||
break;
|
||||
|
||||
case T_start:
|
||||
parseCoordinate( aItem->m_Pos );
|
||||
break;
|
||||
|
||||
case T_end:
|
||||
parseCoordinate( aItem->m_End );
|
||||
break;
|
||||
|
||||
case T_repeat:
|
||||
aItem->m_RepeatCount = parseInt( -1, 100 );
|
||||
NeedRIGHT();
|
||||
break;
|
||||
|
||||
case T_incrx:
|
||||
aItem->m_IncrementVector.x = parseDouble();
|
||||
NeedRIGHT();
|
||||
break;
|
||||
|
||||
case T_incry:
|
||||
aItem->m_IncrementVector.y = parseDouble();
|
||||
NeedRIGHT();
|
||||
break;
|
||||
|
||||
case T_linewidth:
|
||||
aItem->m_LineWidth = parseDouble();
|
||||
NeedRIGHT();
|
||||
break;
|
||||
|
||||
default:
|
||||
Unexpected( CurText() );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void PAGE_LAYOUT_READER_PARSER::parseText( WORKSHEET_DATAITEM_TEXT* aItem )
|
||||
throw( IO_ERROR, PARSE_ERROR )
|
||||
{
|
||||
T token;
|
||||
|
||||
aItem->m_TextSize = m_defaultTextSize;
|
||||
aItem->m_LineWidth = m_defaulTextLineWidth;
|
||||
|
||||
while( ( token = NextTok() ) != T_RIGHT )
|
||||
{
|
||||
if( token == T_EOF)
|
||||
break;
|
||||
|
||||
if( token == T_LEFT )
|
||||
token = NextTok();
|
||||
|
||||
switch( token )
|
||||
{
|
||||
case T_comment: // Comment, search the closing ')'
|
||||
while( ( token = NextTok() ) != T_RIGHT && token != T_EOF );
|
||||
break;
|
||||
|
||||
case T_pos:
|
||||
parseCoordinate( aItem->m_Pos );
|
||||
break;
|
||||
|
||||
case T_repeat:
|
||||
aItem->m_RepeatCount = parseInt( -1, 100 );
|
||||
NeedRIGHT();
|
||||
break;
|
||||
|
||||
case T_incrx:
|
||||
aItem->m_IncrementVector.x = parseDouble();
|
||||
NeedRIGHT();
|
||||
break;
|
||||
|
||||
case T_incry:
|
||||
aItem->m_IncrementVector.y = parseDouble();
|
||||
NeedRIGHT();
|
||||
break;
|
||||
|
||||
case T_incrlabel:
|
||||
aItem->m_IncrementLabel = parseInt(INT_MIN, INT_MAX);
|
||||
NeedRIGHT();
|
||||
break;
|
||||
|
||||
case T_maxlen:
|
||||
aItem->m_BoundingBoxSize.x = parseDouble();
|
||||
NeedRIGHT();
|
||||
break;
|
||||
|
||||
case T_maxheight:
|
||||
aItem->m_BoundingBoxSize.y = parseDouble();
|
||||
NeedRIGHT();
|
||||
break;
|
||||
|
||||
case T_font:
|
||||
while( ( token = NextTok() ) != T_RIGHT )
|
||||
{
|
||||
if( token == T_EOF)
|
||||
break;
|
||||
|
||||
switch( token )
|
||||
{
|
||||
case T_LEFT:
|
||||
break;
|
||||
|
||||
case T_bold:
|
||||
aItem->m_Flags |= USE_BOLD;
|
||||
break;
|
||||
|
||||
case T_italic:
|
||||
aItem->m_Flags |= USE_ITALIC;
|
||||
break;
|
||||
|
||||
case T_size:
|
||||
aItem->m_TextSize.x = parseDouble();
|
||||
aItem->m_TextSize.y = parseDouble();
|
||||
NeedRIGHT();
|
||||
break;
|
||||
|
||||
case T_linewidth:
|
||||
aItem->m_LineWidth = parseDouble();
|
||||
NeedRIGHT();
|
||||
break;
|
||||
|
||||
default:
|
||||
Unexpected( CurText() );
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case T_justify:
|
||||
while( ( token = NextTok() ) != T_RIGHT )
|
||||
{
|
||||
if( token == T_EOF)
|
||||
break;
|
||||
|
||||
switch( token )
|
||||
{
|
||||
case T_center:
|
||||
aItem->m_Hjustify = GR_TEXT_HJUSTIFY_CENTER;
|
||||
aItem->m_Vjustify = GR_TEXT_VJUSTIFY_CENTER;
|
||||
break;
|
||||
|
||||
case T_left:
|
||||
aItem->m_Hjustify = GR_TEXT_HJUSTIFY_LEFT;
|
||||
break;
|
||||
|
||||
case T_right:
|
||||
aItem->m_Hjustify = GR_TEXT_HJUSTIFY_RIGHT;
|
||||
break;
|
||||
|
||||
case T_top:
|
||||
aItem->m_Vjustify = GR_TEXT_VJUSTIFY_TOP;
|
||||
break;
|
||||
|
||||
case T_bottom:
|
||||
aItem->m_Vjustify = GR_TEXT_VJUSTIFY_BOTTOM;
|
||||
break;
|
||||
|
||||
default:
|
||||
Unexpected( CurText() );
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case T_rotate:
|
||||
aItem->m_Orient = parseDouble();
|
||||
NeedRIGHT();
|
||||
break;
|
||||
|
||||
default:
|
||||
Unexpected( CurText() );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// parse an expression like " 25 1 ltcorner)"
|
||||
void PAGE_LAYOUT_READER_PARSER::parseCoordinate( POINT_COORD& aCoord)
|
||||
throw( IO_ERROR, PARSE_ERROR )
|
||||
{
|
||||
T token;
|
||||
|
||||
aCoord.m_Pos.x = parseDouble();
|
||||
aCoord.m_Pos.y = parseDouble();
|
||||
|
||||
while( ( token = NextTok() ) != T_RIGHT )
|
||||
{
|
||||
switch( token )
|
||||
{
|
||||
case T_ltcorner:
|
||||
aCoord.m_Anchor = LT_CORNER; // left top corner
|
||||
break;
|
||||
|
||||
case T_lbcorner:
|
||||
aCoord.m_Anchor = LB_CORNER; // left bottom corner
|
||||
break;
|
||||
|
||||
case T_rbcorner:
|
||||
aCoord.m_Anchor = RB_CORNER; // right bottom corner
|
||||
break;
|
||||
|
||||
case T_rtcorner:
|
||||
aCoord.m_Anchor = RT_CORNER; // right top corner
|
||||
break;
|
||||
|
||||
default:
|
||||
Unexpected( CurText() );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int PAGE_LAYOUT_READER_PARSER::parseInt( int aMin, int aMax )
|
||||
{
|
||||
T token = NextTok();
|
||||
|
||||
if( token != T_NUMBER )
|
||||
Expecting( T_NUMBER );
|
||||
|
||||
int val = atoi( CurText() );
|
||||
|
||||
if( val < aMin )
|
||||
val = aMin;
|
||||
else if( val > aMax )
|
||||
val = aMax;
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
|
||||
double PAGE_LAYOUT_READER_PARSER::parseDouble()
|
||||
{
|
||||
T token = NextTok();
|
||||
|
||||
if( token != T_NUMBER )
|
||||
Expecting( T_NUMBER );
|
||||
|
||||
double val = strtod( CurText(), NULL );
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
// defaultPageLayout is the default page layout description
|
||||
// using the S expr.
|
||||
// see page_layout_default_shape.cpp
|
||||
extern const char defaultPageLayout[];
|
||||
|
||||
void WORKSHEET_LAYOUT::SetDefaultLayout()
|
||||
{
|
||||
ClearList();
|
||||
PAGE_LAYOUT_READER_PARSER lp_parser( defaultPageLayout, wxT( "default page" ) );
|
||||
|
||||
try
|
||||
{
|
||||
lp_parser.Parse( this );
|
||||
}
|
||||
catch( IO_ERROR ioe )
|
||||
{
|
||||
wxLogMessage( ioe.errorText );
|
||||
}
|
||||
}
|
||||
|
||||
#include <wx/file.h>
|
||||
|
||||
// SetLayout() try to load a custom layout file,
|
||||
// currently defined by the environment variable KICAD_WKSFILE
|
||||
// (a *.kicad_wks file).
|
||||
// if does not exists, loads the default page layout.
|
||||
void WORKSHEET_LAYOUT::SetLayout()
|
||||
{
|
||||
wxString fullFileName;
|
||||
wxGetEnv( wxT( "KICAD_WKSFILE" ), &fullFileName );
|
||||
|
||||
if( fullFileName.IsEmpty() || !wxFileExists( fullFileName ) )
|
||||
{
|
||||
#if 0
|
||||
if( !fullFileName.IsEmpty() )
|
||||
{
|
||||
wxLogMessage( wxT("Page layout file <%s> not found"),
|
||||
fullFileName.GetData() );
|
||||
}
|
||||
#endif
|
||||
SetDefaultLayout();
|
||||
return;
|
||||
}
|
||||
|
||||
wxFile wksFile( fullFileName );
|
||||
|
||||
if( ! wksFile.IsOpened() )
|
||||
{
|
||||
SetDefaultLayout();
|
||||
return;
|
||||
}
|
||||
|
||||
int filelen = wksFile.Length();
|
||||
char * buffer = new char[filelen+10];
|
||||
|
||||
if( wksFile.Read( buffer, filelen ) != filelen )
|
||||
wxLogMessage( _("The file <%s> was not fully read"),
|
||||
fullFileName.GetData() );
|
||||
else
|
||||
{
|
||||
buffer[filelen]=0;
|
||||
ClearList();
|
||||
PAGE_LAYOUT_READER_PARSER lp_parser( buffer, fullFileName );
|
||||
|
||||
try
|
||||
{
|
||||
lp_parser.Parse( this );
|
||||
}
|
||||
catch( IO_ERROR ioe )
|
||||
{
|
||||
wxLogMessage( ioe.errorText );
|
||||
}
|
||||
}
|
||||
|
||||
delete[] buffer;
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
page_layout
|
||||
setup
|
||||
linewidth
|
||||
textlinewidth
|
||||
textsize
|
||||
comment
|
||||
line
|
||||
rect
|
||||
polygon
|
||||
tbtext
|
||||
ltcorner
|
||||
lbcorner
|
||||
rbcorner
|
||||
rtcorner
|
||||
name
|
||||
pos
|
||||
start
|
||||
end
|
||||
pts
|
||||
xy
|
||||
maxlen
|
||||
maxheight
|
||||
font
|
||||
bold
|
||||
italic
|
||||
size
|
||||
justify
|
||||
left
|
||||
center
|
||||
right
|
||||
top
|
||||
bottom
|
||||
rotate
|
||||
repeat
|
||||
incrx
|
||||
incry
|
||||
incrlabel
|
|
@ -29,7 +29,7 @@
|
|||
#include <reporter.h>
|
||||
|
||||
|
||||
REPORTER& REPORTER::Report( const char *aText )
|
||||
REPORTER& REPORTER::Report( const char* aText )
|
||||
{
|
||||
Report( FROM_UTF8( aText ) );
|
||||
return *this;
|
||||
|
|
|
@ -1,13 +1,8 @@
|
|||
/**
|
||||
* @file title_block_shapes.cpp
|
||||
* @file title_block_shape.cpp
|
||||
* @brief description of graphic items and texts to build a title block
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file creates a lot of structures which define the shape of a title block
|
||||
* and frame references
|
||||
*/
|
||||
|
||||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
|
@ -33,271 +28,261 @@
|
|||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* the class WORKSHEET_DATAITEM (and WORKSHEET_DATAITEM_TEXT) defines
|
||||
* a basic shape of a page layout ( frame references and title block )
|
||||
* Basic shapes are line, rect and texts
|
||||
* the WORKSHEET_DATAITEM coordinates units is the mm, and are relative to
|
||||
* one of 4 page corners.
|
||||
*
|
||||
* These items cannot be drawn or plot "as this". they should be converted
|
||||
* to a "draw list" (WS_DRAW_ITEM_BASE and derived items)
|
||||
|
||||
* The list of these items is stored in a WORKSHEET_LAYOUT instance.
|
||||
*
|
||||
* When building the draw list:
|
||||
* the WORKSHEET_LAYOUT is used to create a WS_DRAW_ITEM_LIST
|
||||
* coordinates are converted to draw/plot coordinates.
|
||||
* texts are expanded if they contain format symbols.
|
||||
* Items with m_RepeatCount > 1 are created m_RepeatCount times
|
||||
*
|
||||
* the WORKSHEET_LAYOUT is created only once.
|
||||
* the WS_DRAW_ITEM_LIST is created each time the page layout is plot/drawn
|
||||
*
|
||||
* the WORKSHEET_LAYOUT instance is created from a S expression which
|
||||
* describes the page layout (can be the default page layout or a custom file).
|
||||
*/
|
||||
|
||||
#include <fctsys.h>
|
||||
#include <drawtxt.h>
|
||||
#include <worksheet.h>
|
||||
#include <class_title_block.h>
|
||||
#include <worksheet_shape_builder.h>
|
||||
|
||||
#define GRID_REF_W Mm2mils( 1.8 ) // height of the band reference grid
|
||||
#define TEXTSIZE Mm2mils( 1.5 ) // worksheet text size
|
||||
#define FRMREF_TXTSIZE Mm2mils( 1.3 ) // worksheet frame reference text size
|
||||
#define VARIABLE_BLOCK_START_POSITION (TEXTSIZE * 10)
|
||||
|
||||
// The coordinates below are relative to the bottom right corner of page and
|
||||
// will be subtracted from this origin.
|
||||
#define BLOCK_OX Mm2mils( 106 )
|
||||
#define BLOCK_KICAD_VERSION_X BLOCK_OX - TEXTSIZE
|
||||
#define BLOCK_KICAD_VERSION_Y TEXTSIZE
|
||||
#define BLOCK_REV_X Mm2mils( 22 )
|
||||
#define BLOCK_REV_Y (TEXTSIZE * 3)
|
||||
#define BLOCK_DATE_X BLOCK_OX - (TEXTSIZE * 15)
|
||||
#define BLOCK_DATE_Y (TEXTSIZE * 3)
|
||||
#define BLOCK_ID_SHEET_X Mm2mils( 22 )
|
||||
#define BLOCK_ID_SHEET_Y TEXTSIZE
|
||||
#define BLOCK_SIZE_SHEET_X BLOCK_OX - TEXTSIZE
|
||||
#define BLOCK_SIZE_SHEET_Y (TEXTSIZE * 3)
|
||||
#define BLOCK_TITLE_X BLOCK_OX - TEXTSIZE
|
||||
#define BLOCK_TITLE_Y (TEXTSIZE * 5)
|
||||
#define BLOCK_FULLSHEETNAME_X BLOCK_OX - TEXTSIZE
|
||||
#define BLOCK_FULLSHEETNAME_Y (TEXTSIZE * 7)
|
||||
#define BLOCK_FILENAME_X BLOCK_OX - TEXTSIZE
|
||||
#define BLOCK_FILENAME_Y (TEXTSIZE * 9)
|
||||
#define BLOCK_COMMENT_X BLOCK_OX - TEXTSIZE
|
||||
#define BLOCK_COMPANY_Y (TEXTSIZE * 11)
|
||||
#define BLOCK_COMMENT1_Y (TEXTSIZE * 13)
|
||||
#define BLOCK_COMMENT2_Y (TEXTSIZE * 15)
|
||||
#define BLOCK_COMMENT3_Y (TEXTSIZE * 17)
|
||||
#define BLOCK_COMMENT4_Y (TEXTSIZE * 19)
|
||||
|
||||
|
||||
// Text attributes set in m_Flags (ORed bits)
|
||||
#define USE_BOLD 1 // has meaning for texts
|
||||
#define USE_THICK_LINE 1 // equivalent to bold for lines
|
||||
#define USE_ITALIC 2 // has meaning for texts
|
||||
#define USE_TEXT_COLOR 4
|
||||
#define SET_UPPER_LIMIT 8 // Flag used to calculate variable position items
|
||||
|
||||
// Work sheet structure type definitions.
|
||||
enum TypeKi_WorkSheetData {
|
||||
WS_TEXT,
|
||||
WS_SEGMENT,
|
||||
WS_UPPER_SEGMENT,
|
||||
WS_LEFT_SEGMENT
|
||||
};
|
||||
|
||||
|
||||
// superior horizontal segment: should be after comments
|
||||
// to know the exact position
|
||||
Ki_WorkSheetData WS_MostUpperLine =
|
||||
WORKSHEET_DATAITEM_POLYPOLYGON::WORKSHEET_DATAITEM_POLYPOLYGON() :
|
||||
WORKSHEET_DATAITEM( WS_POLYPOLYGON )
|
||||
{
|
||||
WS_UPPER_SEGMENT,
|
||||
NULL,
|
||||
BLOCK_OX, TEXTSIZE * 16,
|
||||
0, TEXTSIZE * 16,
|
||||
NULL
|
||||
};
|
||||
m_Orient = 0.0;
|
||||
}
|
||||
|
||||
// Left vertical segment: should be after comments
|
||||
// to know the exact position
|
||||
Ki_WorkSheetData WS_MostLeftLine =
|
||||
const DPOINT WORKSHEET_DATAITEM_POLYPOLYGON::GetCornerPosition( unsigned aIdx,
|
||||
int aRepeat ) const
|
||||
{
|
||||
WS_LEFT_SEGMENT,
|
||||
&WS_MostUpperLine,
|
||||
BLOCK_OX, TEXTSIZE * 16,
|
||||
BLOCK_OX, 0,
|
||||
NULL
|
||||
};
|
||||
DPOINT pos = m_Corners[aIdx];
|
||||
|
||||
// horizontal segment between filename and comments
|
||||
Ki_WorkSheetData WS_SeparatorLine =
|
||||
// Rotation:
|
||||
RotatePoint( &pos.x, &pos.y, m_Orient * 10 );
|
||||
pos += GetStartPos( aRepeat );
|
||||
return pos;
|
||||
}
|
||||
|
||||
void WORKSHEET_DATAITEM_POLYPOLYGON::SetBoundingBox()
|
||||
{
|
||||
WS_SEGMENT,
|
||||
&WS_MostLeftLine,
|
||||
BLOCK_OX, VARIABLE_BLOCK_START_POSITION,
|
||||
0, VARIABLE_BLOCK_START_POSITION,
|
||||
NULL
|
||||
};
|
||||
if( m_Corners.size() == 0 )
|
||||
{
|
||||
m_minCoord.x = m_maxCoord.x = 0.0;
|
||||
m_minCoord.y = m_maxCoord.y = 0.0;
|
||||
return;
|
||||
}
|
||||
|
||||
Ki_WorkSheetData WS_Date =
|
||||
DPOINT pos;
|
||||
pos = m_Corners[0];
|
||||
RotatePoint( &pos.x, &pos.y, m_Orient * 10 );
|
||||
m_minCoord = m_maxCoord = pos;
|
||||
|
||||
for( unsigned ii = 1; ii < m_Corners.size(); ii++ )
|
||||
{
|
||||
pos = m_Corners[ii];
|
||||
RotatePoint( &pos.x, &pos.y, m_Orient * 10 );
|
||||
|
||||
if( m_minCoord.x > pos.x )
|
||||
m_minCoord.x = pos.x;
|
||||
|
||||
if( m_minCoord.y > pos.y )
|
||||
m_minCoord.y = pos.y;
|
||||
|
||||
if( m_maxCoord.x < pos.x )
|
||||
m_maxCoord.x = pos.x;
|
||||
|
||||
if( m_maxCoord.y < pos.y )
|
||||
m_maxCoord.y = pos.y;
|
||||
}
|
||||
}
|
||||
|
||||
bool WORKSHEET_DATAITEM_POLYPOLYGON::IsInsidePage( int ii ) const
|
||||
{
|
||||
WS_TEXT,
|
||||
&WS_SeparatorLine,
|
||||
BLOCK_DATE_X, BLOCK_DATE_Y,
|
||||
0, 0,
|
||||
wxT( "Date: %D" )
|
||||
};
|
||||
DPOINT pos = GetStartPos( ii );
|
||||
pos += m_minCoord; // left top pos of bounding box
|
||||
|
||||
Ki_WorkSheetData WS_Licence =
|
||||
if( m_LT_Corner.x > pos.x || m_LT_Corner.y > pos.y )
|
||||
return false;
|
||||
|
||||
pos = GetStartPos( ii );
|
||||
pos += m_maxCoord; // rignt bottom pos of bounding box
|
||||
|
||||
if( m_RB_Corner.x < pos.x || m_RB_Corner.y < pos.y )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
const wxPoint WORKSHEET_DATAITEM_POLYPOLYGON::GetCornerPositionUi( unsigned aIdx,
|
||||
int aRepeat ) const
|
||||
{
|
||||
WS_TEXT,
|
||||
&WS_Date,
|
||||
BLOCK_KICAD_VERSION_X,BLOCK_KICAD_VERSION_Y,
|
||||
0,
|
||||
0,
|
||||
wxT("%K") // Kicad version
|
||||
};
|
||||
DPOINT pos = GetCornerPosition( aIdx, aRepeat );
|
||||
pos = pos * m_WSunits2Iu;
|
||||
return wxPoint( int(pos.x), int(pos.y) );
|
||||
}
|
||||
|
||||
Ki_WorkSheetData WS_Revision =
|
||||
WORKSHEET_DATAITEM_TEXT::WORKSHEET_DATAITEM_TEXT( const wxChar* aTextBase ) :
|
||||
WORKSHEET_DATAITEM( WS_TEXT )
|
||||
{
|
||||
WS_TEXT,
|
||||
&WS_Licence,
|
||||
BLOCK_REV_X, BLOCK_REV_Y,
|
||||
0, 0,
|
||||
wxT( "Rev: %R" ),
|
||||
USE_BOLD
|
||||
};
|
||||
m_TextBase = aTextBase;
|
||||
m_IncrementLabel = 1;
|
||||
m_Hjustify = GR_TEXT_HJUSTIFY_LEFT;
|
||||
m_Vjustify = GR_TEXT_VJUSTIFY_CENTER;
|
||||
m_Orient = 0.0;
|
||||
m_TextSize.x = m_TextSize.y = TB_DEFAULT_TEXTSIZE;
|
||||
}
|
||||
|
||||
Ki_WorkSheetData WS_SizeSheet =
|
||||
void WORKSHEET_DATAITEM_TEXT::TransfertSetupToGraphicText( WS_DRAW_ITEM_TEXT* aGText )
|
||||
{
|
||||
WS_TEXT,
|
||||
&WS_Revision,
|
||||
BLOCK_SIZE_SHEET_X,BLOCK_SIZE_SHEET_Y,
|
||||
0, 0,
|
||||
wxT( "Size: %Z" ) // Paper format name
|
||||
};
|
||||
aGText->SetHorizJustify( m_Hjustify ) ;
|
||||
aGText->SetVertJustify( m_Vjustify );
|
||||
aGText->SetOrientation( m_Orient * 10 ); // graphic text orient unit = 0.1 degree
|
||||
}
|
||||
|
||||
Ki_WorkSheetData WS_IdentSheet =
|
||||
void WORKSHEET_DATAITEM_TEXT::IncrementLabel( int aIncr )
|
||||
{
|
||||
WS_TEXT,
|
||||
&WS_SizeSheet,
|
||||
BLOCK_ID_SHEET_X,BLOCK_ID_SHEET_Y,
|
||||
0, 0,
|
||||
wxT( "Id: %S/%N" )
|
||||
};
|
||||
wxChar lbchar = m_TextBase[0];
|
||||
if( lbchar >= '0' && lbchar <= '9' )
|
||||
// A number is expected:
|
||||
m_FullText.Printf( wxT("%d"), aIncr + lbchar - '0' );
|
||||
else
|
||||
m_FullText.Printf( wxT("%c"), aIncr + lbchar );
|
||||
}
|
||||
|
||||
Ki_WorkSheetData WS_Title =
|
||||
void WORKSHEET_DATAITEM_TEXT::SetConstrainedTextSize()
|
||||
{
|
||||
WS_TEXT,
|
||||
&WS_IdentSheet,
|
||||
BLOCK_TITLE_X, BLOCK_TITLE_Y,
|
||||
0, 0,
|
||||
wxT( "Title: %T" ),
|
||||
USE_BOLD
|
||||
};
|
||||
m_ConstrainedTextSize = m_TextSize;
|
||||
|
||||
Ki_WorkSheetData WS_SheetFilename =
|
||||
if( m_BoundingBoxSize.x )
|
||||
{
|
||||
bool italic = (m_Flags & USE_ITALIC) != 0;
|
||||
int linewidth = 0;
|
||||
int lenMsg = ReturnGraphicTextWidth( m_FullText, m_TextSize.x, italic, linewidth );
|
||||
if( lenMsg > m_BoundingBoxSize.x )
|
||||
m_ConstrainedTextSize.x = m_TextSize.x * m_BoundingBoxSize.x / lenMsg;
|
||||
}
|
||||
|
||||
if( m_BoundingBoxSize.y )
|
||||
{
|
||||
if( m_ConstrainedTextSize.y > m_BoundingBoxSize.y )
|
||||
m_ConstrainedTextSize.y = m_BoundingBoxSize.y;
|
||||
}
|
||||
}
|
||||
|
||||
const DPOINT WORKSHEET_DATAITEM::GetStartPos( int ii ) const
|
||||
{
|
||||
WS_TEXT,
|
||||
&WS_Title,
|
||||
BLOCK_FILENAME_X, BLOCK_FILENAME_Y,
|
||||
0, 0,
|
||||
wxT( "File: %F" )
|
||||
};
|
||||
DPOINT pos;
|
||||
pos.x = m_Pos.m_Pos.x + ( m_IncrementVector.x * ii );
|
||||
pos.y = m_Pos.m_Pos.y + ( m_IncrementVector.y * ii );
|
||||
|
||||
Ki_WorkSheetData WS_FullSheetName =
|
||||
switch( m_Pos.m_Anchor )
|
||||
{
|
||||
case RB_CORNER: // right bottom corner
|
||||
pos = m_RB_Corner - pos;
|
||||
break;
|
||||
|
||||
case RT_CORNER: // right top corner
|
||||
pos.x = m_RB_Corner.x - pos.x;
|
||||
pos.y = m_LT_Corner.y + pos.y;
|
||||
break;
|
||||
|
||||
case LB_CORNER: // left bottom corner
|
||||
pos.x = m_LT_Corner.x + pos.x;
|
||||
pos.y = m_RB_Corner.y - pos.y;
|
||||
break;
|
||||
|
||||
case LT_CORNER: // left top corner
|
||||
pos = m_LT_Corner + pos;
|
||||
break;
|
||||
}
|
||||
|
||||
return pos;
|
||||
}
|
||||
|
||||
const wxPoint WORKSHEET_DATAITEM::GetStartPosUi( int ii ) const
|
||||
{
|
||||
WS_TEXT,
|
||||
&WS_SheetFilename,
|
||||
BLOCK_FULLSHEETNAME_X,BLOCK_FULLSHEETNAME_Y,
|
||||
0,
|
||||
0,
|
||||
wxT( "Sheet: %P" ) // Full sheet name (sheet path)
|
||||
};
|
||||
DPOINT pos = GetStartPos( ii );
|
||||
pos = pos * m_WSunits2Iu;
|
||||
return wxPoint( int(pos.x), int(pos.y) );
|
||||
}
|
||||
|
||||
Ki_WorkSheetData WS_Company =
|
||||
const DPOINT WORKSHEET_DATAITEM::GetEndPos( int ii ) const
|
||||
{
|
||||
WS_TEXT,
|
||||
&WS_FullSheetName,
|
||||
BLOCK_COMMENT_X,BLOCK_COMPANY_Y,
|
||||
0, 0,
|
||||
wxT("%Y"), // Company name
|
||||
USE_BOLD | SET_UPPER_LIMIT | USE_TEXT_COLOR
|
||||
};
|
||||
DPOINT pos;
|
||||
pos.x = m_End.m_Pos.x + ( m_IncrementVector.x * ii );
|
||||
pos.y = m_End.m_Pos.y + ( m_IncrementVector.y * ii );
|
||||
switch( m_End.m_Anchor )
|
||||
{
|
||||
case RB_CORNER: // right bottom corner
|
||||
pos = m_RB_Corner - pos;
|
||||
break;
|
||||
|
||||
Ki_WorkSheetData WS_Comment1 =
|
||||
case RT_CORNER: // right top corner
|
||||
pos.x = m_RB_Corner.x - pos.x;
|
||||
pos.y = m_LT_Corner.y + pos.y;
|
||||
break;
|
||||
|
||||
case LB_CORNER: // left bottom corner
|
||||
pos.x = m_LT_Corner.x + pos.x;
|
||||
pos.y = m_RB_Corner.y - pos.y;
|
||||
break;
|
||||
|
||||
case LT_CORNER: // left top corner
|
||||
pos = m_LT_Corner + pos;
|
||||
break;
|
||||
}
|
||||
|
||||
return pos;
|
||||
}
|
||||
|
||||
const wxPoint WORKSHEET_DATAITEM::GetEndPosUi( int ii ) const
|
||||
{
|
||||
WS_TEXT,
|
||||
&WS_Company,
|
||||
BLOCK_COMMENT_X,BLOCK_COMMENT1_Y,
|
||||
0, 0,
|
||||
wxT("%C1"), // Comment 1
|
||||
SET_UPPER_LIMIT | USE_TEXT_COLOR
|
||||
};
|
||||
DPOINT pos = GetEndPos( ii );
|
||||
pos = pos * m_WSunits2Iu;
|
||||
return wxPoint( int(pos.x), int(pos.y) );
|
||||
}
|
||||
|
||||
Ki_WorkSheetData WS_Comment2 =
|
||||
|
||||
bool WORKSHEET_DATAITEM::IsInsidePage( int ii ) const
|
||||
{
|
||||
WS_TEXT,
|
||||
&WS_Comment1,
|
||||
BLOCK_COMMENT_X,BLOCK_COMMENT2_Y,
|
||||
0, 0,
|
||||
wxT("%C2"), // Comment 2
|
||||
SET_UPPER_LIMIT | USE_TEXT_COLOR
|
||||
};
|
||||
DPOINT pos = GetStartPos( ii );
|
||||
|
||||
Ki_WorkSheetData WS_Comment3 =
|
||||
{
|
||||
WS_TEXT,
|
||||
&WS_Comment2,
|
||||
BLOCK_COMMENT_X,BLOCK_COMMENT3_Y,
|
||||
0, 0,
|
||||
wxT("%C3"), // Comment 3
|
||||
SET_UPPER_LIMIT | USE_TEXT_COLOR
|
||||
};
|
||||
if( m_RB_Corner.x < pos.x || m_LT_Corner.x > pos.x )
|
||||
return false;
|
||||
|
||||
Ki_WorkSheetData WS_Comment4 =
|
||||
{
|
||||
WS_TEXT,
|
||||
&WS_Comment3,
|
||||
BLOCK_COMMENT_X, BLOCK_COMMENT4_Y,
|
||||
0, 0,
|
||||
wxT("%C4"), // Comment 4
|
||||
SET_UPPER_LIMIT | USE_TEXT_COLOR
|
||||
};
|
||||
if( m_RB_Corner.y < pos.y || m_LT_Corner.y > pos.y )
|
||||
return false;
|
||||
|
||||
pos = GetEndPos( ii );
|
||||
|
||||
// horizontal segment above COMPANY NAME
|
||||
Ki_WorkSheetData WS_Segm3 =
|
||||
{
|
||||
WS_SEGMENT,
|
||||
&WS_Comment4,
|
||||
BLOCK_OX, TEXTSIZE * 6,
|
||||
0, TEXTSIZE * 6,
|
||||
NULL
|
||||
};
|
||||
if( m_RB_Corner.x < pos.x || m_LT_Corner.x > pos.x )
|
||||
return false;
|
||||
|
||||
if( m_RB_Corner.y < pos.y || m_LT_Corner.y > pos.y )
|
||||
return false;
|
||||
|
||||
// vertical segment of the left REV and SHEET
|
||||
Ki_WorkSheetData WS_Segm4 =
|
||||
{
|
||||
WS_SEGMENT,
|
||||
&WS_Segm3,
|
||||
BLOCK_REV_X + TEXTSIZE,TEXTSIZE * 4,
|
||||
BLOCK_REV_X + TEXTSIZE, 0,
|
||||
NULL
|
||||
};
|
||||
return true;
|
||||
}
|
||||
|
||||
double WORKSHEET_DATAITEM::m_WSunits2Iu = 1.0;
|
||||
DPOINT WORKSHEET_DATAITEM::m_RB_Corner;
|
||||
DPOINT WORKSHEET_DATAITEM::m_LT_Corner;
|
||||
|
||||
Ki_WorkSheetData WS_Segm5 =
|
||||
{
|
||||
WS_SEGMENT,
|
||||
&WS_Segm4,
|
||||
BLOCK_OX, TEXTSIZE * 2,
|
||||
0, TEXTSIZE * 2,
|
||||
NULL
|
||||
};
|
||||
|
||||
|
||||
Ki_WorkSheetData WS_Segm6 =
|
||||
{
|
||||
WS_SEGMENT,
|
||||
&WS_Segm5,
|
||||
BLOCK_OX, TEXTSIZE * 4,
|
||||
0, TEXTSIZE * 4,
|
||||
NULL
|
||||
};
|
||||
|
||||
|
||||
Ki_WorkSheetData WS_Segm7 =
|
||||
{
|
||||
WS_SEGMENT,
|
||||
&WS_Segm6,
|
||||
BLOCK_OX - (TEXTSIZE * 11),TEXTSIZE * 4,
|
||||
BLOCK_OX - (TEXTSIZE * 11),TEXTSIZE * 2,
|
||||
NULL
|
||||
};
|
||||
|
||||
#include <worksheet_shape_builder.h>
|
||||
WORKSHEET_LAYOUT dataList; // The layout shape
|
||||
|
||||
void WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList(
|
||||
const wxString& aPaperFormat,
|
||||
|
@ -306,178 +291,147 @@ void WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList(
|
|||
const TITLE_BLOCK& aTitleBlock,
|
||||
EDA_COLOR_T aLineColor, EDA_COLOR_T aTextColor )
|
||||
{
|
||||
wxSize textsize( TEXTSIZE * m_milsToIu, TEXTSIZE * m_milsToIu );
|
||||
wxSize size_ref( FRMREF_TXTSIZE * m_milsToIu,
|
||||
FRMREF_TXTSIZE * m_milsToIu );
|
||||
wxString msg;
|
||||
#define milsTomm (25.4/1000)
|
||||
|
||||
m_titleBlock = &aTitleBlock,
|
||||
m_paperFormat = &aPaperFormat,
|
||||
m_fileName = &aFileName,
|
||||
m_sheetFullName = &aSheetPathHumanReadable;
|
||||
|
||||
// Build the basic layout shape, if the layout list is empty
|
||||
if( dataList.GetCount() == 0 )
|
||||
dataList.SetLayout();
|
||||
|
||||
WORKSHEET_DATAITEM::m_WSunits2Iu = m_milsToIu / milsTomm;
|
||||
|
||||
// Left top corner position
|
||||
wxPoint lt_corner;
|
||||
DPOINT lt_corner;
|
||||
lt_corner.x = m_LTmargin.x;
|
||||
lt_corner.y = m_LTmargin.y;
|
||||
WORKSHEET_DATAITEM::m_LT_Corner = lt_corner * milsTomm;
|
||||
|
||||
// Right bottom corner position
|
||||
wxPoint rb_corner;
|
||||
DPOINT rb_corner;
|
||||
rb_corner.x = m_pageSize.x - m_RBmargin.x;
|
||||
rb_corner.y = m_pageSize.y - m_RBmargin.y;
|
||||
|
||||
// Draw the border.
|
||||
int ii, jj, ipas, gxpas, gypas;
|
||||
|
||||
wxPoint pos = lt_corner;
|
||||
wxPoint end = rb_corner;
|
||||
for( ii = 0; ii < 2; ii++ )
|
||||
{
|
||||
Append( new WS_DRAW_ITEM_RECT(
|
||||
wxPoint( pos.x * m_milsToIu, pos.y * m_milsToIu ),
|
||||
wxPoint( end.x * m_milsToIu, end.y * m_milsToIu ),
|
||||
m_penSize, aLineColor ) );
|
||||
|
||||
pos.x += GRID_REF_W;
|
||||
pos.y += GRID_REF_W;
|
||||
end.x -= GRID_REF_W;
|
||||
end.y -= GRID_REF_W;
|
||||
}
|
||||
|
||||
ipas = ( rb_corner.x - lt_corner.x ) / PAS_REF;
|
||||
gxpas = ( rb_corner.x - lt_corner.x ) / ipas;
|
||||
|
||||
for( ii = lt_corner.x + gxpas, jj = 1; ipas > 0; ii += gxpas, jj++, ipas-- )
|
||||
{
|
||||
msg.Printf( wxT( "%d" ), jj );
|
||||
|
||||
if( ii < rb_corner.x - PAS_REF / 2 )
|
||||
{
|
||||
Append( new WS_DRAW_ITEM_LINE(
|
||||
wxPoint( ii * m_milsToIu, lt_corner.y * m_milsToIu ),
|
||||
wxPoint( ii * m_milsToIu, ( lt_corner.y + GRID_REF_W ) * m_milsToIu ),
|
||||
m_penSize, aLineColor ) );
|
||||
}
|
||||
|
||||
Append( new WS_DRAW_ITEM_TEXT( msg,
|
||||
wxPoint( ( ii - gxpas / 2 ) * m_milsToIu,
|
||||
( lt_corner.y + GRID_REF_W / 2 ) * m_milsToIu ),
|
||||
size_ref, m_penSize, aLineColor ) );
|
||||
|
||||
if( ii < rb_corner.x - PAS_REF / 2 )
|
||||
{
|
||||
Append( new WS_DRAW_ITEM_LINE(
|
||||
wxPoint( ii * m_milsToIu, rb_corner.y * m_milsToIu ),
|
||||
wxPoint( ii * m_milsToIu, (rb_corner.y - GRID_REF_W ) * m_milsToIu ),
|
||||
m_penSize, aLineColor ) );
|
||||
}
|
||||
|
||||
Append( new WS_DRAW_ITEM_TEXT( msg,
|
||||
wxPoint( ( ii - gxpas / 2 ) * m_milsToIu,
|
||||
( rb_corner.y - GRID_REF_W / 2) * m_milsToIu ),
|
||||
size_ref, m_penSize, aLineColor ) );
|
||||
}
|
||||
|
||||
ipas = ( rb_corner.y - lt_corner.y ) / PAS_REF;
|
||||
gypas = ( rb_corner.y - lt_corner.y ) / ipas;
|
||||
|
||||
for( ii = lt_corner.y + gypas, jj = 0; ipas > 0; ii += gypas, jj++, ipas-- )
|
||||
{
|
||||
if( jj < 26 )
|
||||
msg.Printf( wxT( "%c" ), jj + 'A' );
|
||||
else // I hope 52 identifiers are enough...
|
||||
msg.Printf( wxT( "%c" ), 'a' + jj - 26 );
|
||||
|
||||
if( ii < rb_corner.y - PAS_REF / 2 )
|
||||
{
|
||||
Append( new WS_DRAW_ITEM_LINE(
|
||||
wxPoint( lt_corner.x * m_milsToIu, ii * m_milsToIu ),
|
||||
wxPoint( ( lt_corner.x + GRID_REF_W ) * m_milsToIu, ii * m_milsToIu ),
|
||||
m_penSize, aLineColor ) );
|
||||
}
|
||||
|
||||
Append( new WS_DRAW_ITEM_TEXT( msg,
|
||||
wxPoint( ( lt_corner.x + GRID_REF_W / 2 ) * m_milsToIu,
|
||||
( ii - gypas / 2 ) * m_milsToIu ),
|
||||
size_ref, m_penSize, aLineColor ) );
|
||||
|
||||
if( ii < rb_corner.y - PAS_REF / 2 )
|
||||
{
|
||||
Append( new WS_DRAW_ITEM_LINE(
|
||||
wxPoint( rb_corner.x * m_milsToIu, ii * m_milsToIu ),
|
||||
wxPoint( ( rb_corner.x - GRID_REF_W ) * m_milsToIu, ii * m_milsToIu ),
|
||||
m_penSize, aLineColor ) );
|
||||
}
|
||||
|
||||
Append( new WS_DRAW_ITEM_TEXT( msg,
|
||||
wxPoint( ( rb_corner.x - GRID_REF_W / 2 ) * m_milsToIu,
|
||||
( ii - gxpas / 2 ) * m_milsToIu ),
|
||||
size_ref, m_penSize, aLineColor ) );
|
||||
}
|
||||
|
||||
int upperLimit = VARIABLE_BLOCK_START_POSITION;
|
||||
rb_corner.x -= GRID_REF_W;
|
||||
rb_corner.y -= GRID_REF_W;
|
||||
WORKSHEET_DATAITEM::m_RB_Corner = rb_corner * milsTomm;
|
||||
|
||||
WS_DRAW_ITEM_TEXT* gtext;
|
||||
Ki_WorkSheetData* WsItem;
|
||||
int pensize;
|
||||
bool bold;
|
||||
bool italic = false;
|
||||
EDA_COLOR_T color;
|
||||
|
||||
for( WsItem = &WS_Segm7; WsItem != NULL; WsItem = WsItem->Pnext )
|
||||
for( unsigned ii = 0; ; ii++ )
|
||||
{
|
||||
pos.x = (rb_corner.x - WsItem->m_Posx) * m_milsToIu;
|
||||
pos.y = (rb_corner.y - WsItem->m_Posy) * m_milsToIu;
|
||||
WORKSHEET_DATAITEM* wsItem = dataList.GetItem( ii );
|
||||
|
||||
msg.Empty();
|
||||
|
||||
if( WsItem->m_Type == WS_TEXT && WsItem->m_TextBase )
|
||||
msg = BuildFullText( WsItem->m_TextBase );
|
||||
|
||||
switch( WsItem->m_Type )
|
||||
{
|
||||
case WS_TEXT:
|
||||
if( msg.IsEmpty() )
|
||||
break;
|
||||
bold = false;
|
||||
pensize = m_penSize;
|
||||
color = aLineColor;
|
||||
if( WsItem->m_Flags & USE_TEXT_COLOR )
|
||||
color = aTextColor;
|
||||
|
||||
if( WsItem->m_Flags & USE_BOLD )
|
||||
{
|
||||
bold = true;
|
||||
pensize = GetPenSizeForBold( std::min( textsize.x, textsize.y ) );
|
||||
}
|
||||
Append( gtext = new WS_DRAW_ITEM_TEXT( msg, pos, textsize,
|
||||
pensize, color, italic, bold ) );
|
||||
gtext->SetHorizJustify( GR_TEXT_HJUSTIFY_LEFT );
|
||||
|
||||
if( WsItem->m_Flags & SET_UPPER_LIMIT )
|
||||
upperLimit = std::max( upperLimit, WsItem->m_Posy + TEXTSIZE );
|
||||
if( wsItem == NULL )
|
||||
break;
|
||||
|
||||
case WS_UPPER_SEGMENT:
|
||||
pensize = wsItem->GetPenSizeUi();
|
||||
|
||||
if( upperLimit == 0 )
|
||||
switch( wsItem->m_Type )
|
||||
{
|
||||
case WORKSHEET_DATAITEM::WS_TEXT:
|
||||
{
|
||||
WORKSHEET_DATAITEM_TEXT * wsText = (WORKSHEET_DATAITEM_TEXT*)wsItem;
|
||||
wsText->m_FullText = BuildFullText( wsText->m_TextBase );
|
||||
if( wsText->m_FullText.IsEmpty() )
|
||||
break;
|
||||
|
||||
case WS_LEFT_SEGMENT:
|
||||
WS_MostUpperLine.m_Posy = upperLimit;
|
||||
WS_MostUpperLine.m_Endy = upperLimit;
|
||||
WS_MostLeftLine.m_Posy = upperLimit;
|
||||
pos.y = (rb_corner.y - WsItem->m_Posy) * m_milsToIu;
|
||||
if( pensize == 0 )
|
||||
pensize = m_penSize;
|
||||
|
||||
case WS_SEGMENT:
|
||||
end.x = rb_corner.x - WsItem->m_Endx;
|
||||
end.y = rb_corner.y - WsItem->m_Endy;
|
||||
Append( new WS_DRAW_ITEM_LINE( pos,
|
||||
wxPoint( end.x * m_milsToIu, end.y * m_milsToIu ),
|
||||
m_penSize, aLineColor ) );
|
||||
color = aLineColor;
|
||||
|
||||
if( wsText->m_Flags & USE_TEXT_COLOR )
|
||||
color = aTextColor;
|
||||
|
||||
wsText->SetConstrainedTextSize();
|
||||
wxSize textsize;
|
||||
|
||||
textsize.x = KiROUND( wsText->m_ConstrainedTextSize.x
|
||||
* WORKSHEET_DATAITEM::m_WSunits2Iu );
|
||||
textsize.y = KiROUND( wsText->m_ConstrainedTextSize.y
|
||||
* WORKSHEET_DATAITEM::m_WSunits2Iu );
|
||||
|
||||
if( wsText->IsBold())
|
||||
pensize = GetPenSizeForBold( std::min( textsize.x, textsize.y ) );
|
||||
|
||||
for( int jj = 0; jj < wsText->m_RepeatCount; jj++)
|
||||
{
|
||||
if( ! wsText->IsInsidePage( jj ) )
|
||||
continue;
|
||||
|
||||
Append( gtext = new WS_DRAW_ITEM_TEXT( wsText->m_FullText,
|
||||
wsText->GetStartPosUi( jj ),
|
||||
textsize,
|
||||
pensize, color,
|
||||
wsText->IsItalic(),
|
||||
wsText->IsBold() ) );
|
||||
wsText->TransfertSetupToGraphicText( gtext );
|
||||
|
||||
// Increment label for the next text
|
||||
if( wsText->m_RepeatCount > 1 )
|
||||
wsText->IncrementLabel( jj+1 );
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case WORKSHEET_DATAITEM::WS_SEGMENT:
|
||||
if( pensize == 0 )
|
||||
pensize = m_penSize;
|
||||
|
||||
for( int jj = 0; jj < wsItem->m_RepeatCount; jj++ )
|
||||
{
|
||||
if( ! wsItem->IsInsidePage( jj ) )
|
||||
continue;
|
||||
Append( new WS_DRAW_ITEM_LINE( wsItem->GetStartPosUi( jj ),
|
||||
wsItem->GetEndPosUi( jj ),
|
||||
pensize, aLineColor ) );
|
||||
}
|
||||
break;
|
||||
|
||||
case WORKSHEET_DATAITEM::WS_RECT:
|
||||
if( pensize == 0 )
|
||||
pensize = m_penSize;
|
||||
|
||||
for( int jj = 0; jj < wsItem->m_RepeatCount; jj++ )
|
||||
{
|
||||
if( ! wsItem->IsInsidePage( jj ) )
|
||||
break;
|
||||
|
||||
Append( new WS_DRAW_ITEM_RECT( wsItem->GetStartPosUi( jj ),
|
||||
wsItem->GetEndPosUi( jj ),
|
||||
pensize, aLineColor ) );
|
||||
}
|
||||
break;
|
||||
|
||||
case WORKSHEET_DATAITEM::WS_POLYPOLYGON:
|
||||
{
|
||||
WORKSHEET_DATAITEM_POLYPOLYGON * wspoly =
|
||||
(WORKSHEET_DATAITEM_POLYPOLYGON*) wsItem;
|
||||
for( int jj = 0; jj < wsItem->m_RepeatCount; jj++ )
|
||||
{
|
||||
if( ! wsItem->IsInsidePage( jj ) )
|
||||
continue;
|
||||
|
||||
for( int kk = 0; kk < wspoly->GetPolyCount(); kk++ )
|
||||
{
|
||||
const bool fill = true;
|
||||
WS_DRAW_ITEM_POLYGON* poly = new WS_DRAW_ITEM_POLYGON( fill,
|
||||
pensize, aLineColor );
|
||||
Append( poly );
|
||||
|
||||
// Create polygon outline
|
||||
unsigned ist = wspoly->GetPolyIndexStart( kk );
|
||||
unsigned iend = wspoly->GetPolyIndexEnd( kk );
|
||||
while( ist <= iend )
|
||||
poly->m_Corners.push_back(
|
||||
wspoly->GetCornerPositionUi( ist++, jj ) );
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* @file title_block_shapes_gost.cpp
|
||||
* @file title_block_shape_gost.h
|
||||
* @brief description of graphic items and texts to build a title block
|
||||
* using GOST standard
|
||||
*/
|
||||
|
@ -43,6 +43,17 @@
|
|||
|
||||
#define TEXTSIZE 100 // worksheet text size
|
||||
|
||||
struct Ki_WorkSheetData
|
||||
{
|
||||
public:
|
||||
int m_Type;
|
||||
Ki_WorkSheetData* Pnext;
|
||||
int m_Posx, m_Posy;
|
||||
int m_Endx, m_Endy;
|
||||
const wxChar* m_TextBase;
|
||||
int m_Flags;
|
||||
};
|
||||
|
||||
// Work sheet structure type definitions.
|
||||
enum TypeKi_WorkSheetData {
|
||||
WS_OSN,
|
||||
|
|
|
@ -72,7 +72,7 @@ const wxString NetlistFileWildcard( _( "KiCad netlist files (*.net)|*.net" ) );
|
|||
const wxString GerberFileWildcard( _( "Gerber files (*.pho)|*.pho" ) );
|
||||
const wxString LegacyPcbFileWildcard( _( "KiCad printed circuit board files (*.brd)|*.brd" ) );
|
||||
const wxString EaglePcbFileWildcard( _( "Eagle ver. 6.x XML PCB files (*.brd)|*.brd" ) );
|
||||
const wxString PCadPcbFileWildcard( _( "P-Cad 2002/2004 ASCII PCB files (*.pcb)|*.pcb" ) );
|
||||
const wxString PCadPcbFileWildcard( _( "P-Cad 200x ASCII PCB files (*.pcb)|*.pcb" ) );
|
||||
const wxString PcbFileWildcard( _( "KiCad s-expr printed circuit board files (*.kicad_pcb)|*.kicad_pcb" ) );
|
||||
const wxString KiCadFootprintLibFileWildcard( _( "KiCad footprint s-expre library file (*.kicad_mod)|*.kicad_mod" ) );
|
||||
const wxString KiCadFootprintLibPathWildcard( _( "KiCad footprint s-expre library path (*.pretty)|*.pretty" ) );
|
||||
|
|
|
@ -46,15 +46,68 @@
|
|||
|
||||
static const wxString productName = wxT( "KiCad E.D.A. " );
|
||||
|
||||
/* Draws the item list crated by BuildWorkSheetGraphicList
|
||||
* aClipBox = the clipping rect, or NULL if no clipping
|
||||
* aDC = the current Device Context
|
||||
*/
|
||||
void WS_DRAW_ITEM_LIST::Draw( EDA_RECT* aClipBox, wxDC* aDC )
|
||||
{
|
||||
for( WS_DRAW_ITEM_BASE* item = GetFirst(); item; item = GetNext() )
|
||||
{
|
||||
switch( item->GetType() )
|
||||
{
|
||||
case WS_DRAW_ITEM_BASE::wsg_line:
|
||||
{
|
||||
WS_DRAW_ITEM_LINE* line = (WS_DRAW_ITEM_LINE*) item;
|
||||
GRLine( aClipBox, aDC,
|
||||
line->GetStart(), line->GetEnd(),
|
||||
line->GetPenWidth(), line->GetColor() );
|
||||
}
|
||||
break;
|
||||
|
||||
void DrawPageLayout( wxDC* aDC, EDA_DRAW_PANEL * aCanvas,
|
||||
case WS_DRAW_ITEM_BASE::wsg_rect:
|
||||
{
|
||||
WS_DRAW_ITEM_RECT* rect = (WS_DRAW_ITEM_RECT*) item;
|
||||
GRRect( aClipBox, aDC,
|
||||
rect->GetStart().x, rect->GetStart().y,
|
||||
rect->GetEnd().x, rect->GetEnd().y,
|
||||
rect->GetPenWidth(), rect->GetColor() );
|
||||
}
|
||||
break;
|
||||
|
||||
case WS_DRAW_ITEM_BASE::wsg_text:
|
||||
{
|
||||
WS_DRAW_ITEM_TEXT* text = (WS_DRAW_ITEM_TEXT*) item;
|
||||
DrawGraphicText( aClipBox, aDC, text->GetTextPosition(),
|
||||
text->GetColor(), text->GetText(),
|
||||
text->GetOrientation(), text->GetSize(),
|
||||
text->GetHorizJustify(), text->GetVertJustify(),
|
||||
text->GetPenWidth(), text->IsItalic(), text->IsBold() );
|
||||
}
|
||||
break;
|
||||
|
||||
case WS_DRAW_ITEM_BASE::wsg_poly:
|
||||
{
|
||||
WS_DRAW_ITEM_POLYGON* poly = (WS_DRAW_ITEM_POLYGON*) item;
|
||||
GRPoly( aClipBox, aDC,
|
||||
poly->m_Corners.size(), &poly->m_Corners[0],
|
||||
poly->IsFilled() ? FILLED_SHAPE : NO_FILL,
|
||||
poly->GetPenWidth(),
|
||||
poly->GetColor(), poly->GetColor() );
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DrawPageLayout( wxDC* aDC, EDA_RECT* aClipBox,
|
||||
const PAGE_INFO& aPageInfo,
|
||||
const wxString &aFullSheetName,
|
||||
const wxString& aFileName,
|
||||
TITLE_BLOCK& aTitleBlock,
|
||||
int aSheetCount, int aSheetNumber,
|
||||
int aPenWidth, double aScalar,
|
||||
EDA_COLOR_T aLineColor, EDA_COLOR_T aTextColor )
|
||||
EDA_COLOR_T aColor, EDA_COLOR_T aAltColor )
|
||||
{
|
||||
GRSetDrawMode( aDC, GR_COPY );
|
||||
WS_DRAW_ITEM_LIST drawList;
|
||||
|
@ -72,56 +125,10 @@ void DrawPageLayout( wxDC* aDC, EDA_DRAW_PANEL * aCanvas,
|
|||
|
||||
drawList.BuildWorkSheetGraphicList(
|
||||
aPageInfo.GetType(), aFullSheetName, aFileName,
|
||||
aTitleBlock, aLineColor, aTextColor );
|
||||
aTitleBlock, aColor, aAltColor );
|
||||
|
||||
// Draw item list
|
||||
for( WS_DRAW_ITEM_BASE* item = drawList.GetFirst(); item;
|
||||
item = drawList.GetNext() )
|
||||
{
|
||||
switch( item->GetType() )
|
||||
{
|
||||
case WS_DRAW_ITEM_BASE::wsg_line:
|
||||
{
|
||||
WS_DRAW_ITEM_LINE* line = (WS_DRAW_ITEM_LINE*) item;
|
||||
GRLine( aCanvas ? aCanvas->GetClipBox() : NULL, aDC,
|
||||
line->GetStart(), line->GetEnd(),
|
||||
line->GetPenWidth(), line->GetColor() );
|
||||
}
|
||||
break;
|
||||
|
||||
case WS_DRAW_ITEM_BASE::wsg_rect:
|
||||
{
|
||||
WS_DRAW_ITEM_RECT* rect = (WS_DRAW_ITEM_RECT*) item;
|
||||
GRRect( aCanvas ? aCanvas->GetClipBox() : NULL, aDC,
|
||||
rect->GetStart().x, rect->GetStart().y,
|
||||
rect->GetEnd().x, rect->GetEnd().y,
|
||||
rect->GetPenWidth(), rect->GetColor() );
|
||||
}
|
||||
break;
|
||||
|
||||
case WS_DRAW_ITEM_BASE::wsg_text:
|
||||
{
|
||||
WS_DRAW_ITEM_TEXT* text = (WS_DRAW_ITEM_TEXT*) item;
|
||||
DrawGraphicText( aCanvas, aDC, text->GetTextPosition(),
|
||||
text->GetColor(), text->GetText(),
|
||||
text->GetOrientation(), text->GetSize(),
|
||||
text->GetHorizJustify(), text->GetVertJustify(),
|
||||
text->GetPenWidth(), text->IsItalic(), text->IsBold() );
|
||||
}
|
||||
break;
|
||||
|
||||
case WS_DRAW_ITEM_BASE::wsg_poly:
|
||||
{
|
||||
WS_DRAW_ITEM_POLYGON* poly = (WS_DRAW_ITEM_POLYGON*) item;
|
||||
GRPoly( aCanvas ? aCanvas->GetClipBox() : NULL, aDC,
|
||||
poly->m_Corners.size(), &poly->m_Corners[0],
|
||||
poly->IsFilled() ? FILLED_SHAPE : NO_FILL,
|
||||
poly->GetPenWidth(),
|
||||
poly->GetColor(), poly->GetColor() );
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
drawList.Draw( aClipBox, aDC );
|
||||
}
|
||||
|
||||
|
||||
|
@ -146,59 +153,13 @@ void EDA_DRAW_FRAME::DrawWorkSheet( wxDC* aDC, BASE_SCREEN* aScreen, int aLineWi
|
|||
TITLE_BLOCK t_block = GetTitleBlock();
|
||||
EDA_COLOR_T color = RED;
|
||||
|
||||
DrawPageLayout( aDC, m_canvas, pageInfo,
|
||||
DrawPageLayout( aDC, m_canvas->GetClipBox(), pageInfo,
|
||||
aFilename, GetScreenDesc(), t_block,
|
||||
aScreen->m_NumberOfScreens, aScreen->m_ScreenNumber,
|
||||
aLineWidth, aScalar, color, color );
|
||||
}
|
||||
|
||||
|
||||
const wxString EDA_DRAW_FRAME::GetXYSheetReferences( const wxPoint& aPosition ) const
|
||||
{
|
||||
const PAGE_INFO& pageInfo = GetPageSettings();
|
||||
|
||||
int ii;
|
||||
int xg, yg;
|
||||
int ipas;
|
||||
int gxpas, gypas;
|
||||
int refx, refy;
|
||||
wxString msg;
|
||||
|
||||
// Upper left corner
|
||||
refx = pageInfo.GetLeftMarginMils();
|
||||
refy = pageInfo.GetTopMarginMils();
|
||||
|
||||
// lower right corner
|
||||
xg = pageInfo.GetSizeMils().x - pageInfo.GetRightMarginMils();
|
||||
yg = pageInfo.GetSizeMils().y - pageInfo.GetBottomMarginMils();
|
||||
|
||||
// Get the Y axis identifier (A symbol A ... Z)
|
||||
if( aPosition.y < refy || aPosition.y > yg ) // Outside of Y limits
|
||||
msg << wxT( "?" );
|
||||
else
|
||||
{
|
||||
ipas = ( yg - refy ) / PAS_REF; // ipas = Y count sections
|
||||
gypas = ( yg - refy ) / ipas; // gypas = Y section size
|
||||
ii = ( aPosition.y - refy ) / gypas;
|
||||
msg.Printf( wxT( "%c" ), 'A' + ii );
|
||||
}
|
||||
|
||||
// Get the X axis identifier (A number 1 ... n)
|
||||
if( aPosition.x < refx || aPosition.x > xg ) // Outside of X limits
|
||||
msg << wxT( "?" );
|
||||
else
|
||||
{
|
||||
ipas = ( xg - refx ) / PAS_REF; // ipas = X count sections
|
||||
gxpas = ( xg - refx ) / ipas; // gxpas = X section size
|
||||
|
||||
ii = ( aPosition.x - refx ) / gxpas;
|
||||
msg << ii + 1;
|
||||
}
|
||||
|
||||
return msg;
|
||||
}
|
||||
|
||||
|
||||
wxString EDA_DRAW_FRAME::GetScreenDesc()
|
||||
{
|
||||
// Virtual function, in basic function, returns
|
||||
|
@ -293,20 +254,17 @@ wxString WS_DRAW_ITEM_LIST::BuildFullText( const wxString& aTextbase )
|
|||
format = aTextbase[++ii];
|
||||
switch( format )
|
||||
{
|
||||
case '0':
|
||||
case '1':
|
||||
msg += m_titleBlock->GetComment1();
|
||||
break;
|
||||
|
||||
case '2':
|
||||
msg += m_titleBlock->GetComment2();
|
||||
break;
|
||||
|
||||
case '3':
|
||||
msg += m_titleBlock->GetComment3();
|
||||
break;
|
||||
|
||||
case '4':
|
||||
msg += m_titleBlock->GetComment4();
|
||||
case '5':
|
||||
case '6':
|
||||
case '7':
|
||||
case '8':
|
||||
case '9':
|
||||
msg += m_titleBlock->GetComment( format - '0');
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -326,43 +284,42 @@ void TITLE_BLOCK::Format( OUTPUTFORMATTER* aFormatter, int aNestLevel, int aCont
|
|||
throw( IO_ERROR )
|
||||
{
|
||||
// Don't write the title block information if there is nothing to write.
|
||||
if( !m_title.IsEmpty() || !m_date.IsEmpty() || !m_revision.IsEmpty()
|
||||
|| !m_company.IsEmpty() || !m_comment1.IsEmpty() || !m_comment2.IsEmpty()
|
||||
|| !m_comment3.IsEmpty() || !m_comment4.IsEmpty() )
|
||||
bool isempty = true;
|
||||
for( unsigned idx = 0; idx < m_tbTexts.GetCount(); idx++ )
|
||||
{
|
||||
if( ! m_tbTexts[idx].IsEmpty() )
|
||||
{
|
||||
isempty = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if( !isempty )
|
||||
{
|
||||
aFormatter->Print( aNestLevel, "(title_block\n" );
|
||||
|
||||
if( !m_title.IsEmpty() )
|
||||
if( !GetTitle().IsEmpty() )
|
||||
aFormatter->Print( aNestLevel+1, "(title %s)\n",
|
||||
aFormatter->Quotew( m_title ).c_str() );
|
||||
aFormatter->Quotew( GetTitle() ).c_str() );
|
||||
|
||||
if( !m_date.IsEmpty() )
|
||||
if( !GetDate().IsEmpty() )
|
||||
aFormatter->Print( aNestLevel+1, "(date %s)\n",
|
||||
aFormatter->Quotew( m_date ).c_str() );
|
||||
aFormatter->Quotew( GetDate() ).c_str() );
|
||||
|
||||
if( !m_revision.IsEmpty() )
|
||||
if( !GetRevision().IsEmpty() )
|
||||
aFormatter->Print( aNestLevel+1, "(rev %s)\n",
|
||||
aFormatter->Quotew( m_revision ).c_str() );
|
||||
aFormatter->Quotew( GetRevision() ).c_str() );
|
||||
|
||||
if( !m_company.IsEmpty() )
|
||||
if( !GetCompany().IsEmpty() )
|
||||
aFormatter->Print( aNestLevel+1, "(company %s)\n",
|
||||
aFormatter->Quotew( m_company ).c_str() );
|
||||
aFormatter->Quotew( GetCompany() ).c_str() );
|
||||
|
||||
if( !m_comment1.IsEmpty() )
|
||||
aFormatter->Print( aNestLevel+1, "(comment 1 %s)\n",
|
||||
aFormatter->Quotew( m_comment1 ).c_str() );
|
||||
|
||||
if( !m_comment2.IsEmpty() )
|
||||
aFormatter->Print( aNestLevel+1, "(comment 2 %s)\n",
|
||||
aFormatter->Quotew( m_comment2 ).c_str() );
|
||||
|
||||
if( !m_comment3.IsEmpty() )
|
||||
aFormatter->Print( aNestLevel+1, "(comment 3 %s)\n",
|
||||
aFormatter->Quotew( m_comment3 ).c_str() );
|
||||
|
||||
if( !m_comment4.IsEmpty() )
|
||||
aFormatter->Print( aNestLevel+1, "(comment 4 %s)\n",
|
||||
aFormatter->Quotew( m_comment4 ).c_str() );
|
||||
for( int ii = 0; ii < 4; ii++ )
|
||||
{
|
||||
if( !GetComment(ii).IsEmpty() )
|
||||
aFormatter->Print( aNestLevel+1, "(comment %d %s)\n", ii+1,
|
||||
aFormatter->Quotew( GetComment(ii) ).c_str() );
|
||||
}
|
||||
|
||||
aFormatter->Print( aNestLevel, ")\n\n" );
|
||||
}
|
||||
|
|
|
@ -1,6 +1,29 @@
|
|||
/*************************************************************************/
|
||||
/* listboxes.cpp: class for displaying footprint list and component list */
|
||||
/*************************************************************************/
|
||||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 1992-2012 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
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file class_components_listbox.h
|
||||
*/
|
||||
|
||||
#include <fctsys.h>
|
||||
#include <wxstruct.h>
|
||||
|
@ -8,15 +31,11 @@
|
|||
#include <cvpcb.h>
|
||||
#include <cvpcb_mainframe.h>
|
||||
#include <cvstruct.h>
|
||||
#include <cvpcb_id.h>
|
||||
|
||||
|
||||
/**************************************************/
|
||||
/* ListBox handling the schematic components list */
|
||||
/**************************************************/
|
||||
|
||||
COMPONENTS_LISTBOX::COMPONENTS_LISTBOX( CVPCB_MAINFRAME* parent, wxWindowID id,
|
||||
const wxPoint& loc, const wxSize& size,
|
||||
int nbitems, wxString choice[] ) :
|
||||
const wxPoint& loc, const wxSize& size ) :
|
||||
ITEMS_LISTBOX_BASE( parent, id, loc, size, LISTB_STYLE & ~wxLC_SINGLE_SEL )
|
||||
{
|
||||
}
|
||||
|
@ -27,12 +46,10 @@ COMPONENTS_LISTBOX::~COMPONENTS_LISTBOX()
|
|||
}
|
||||
|
||||
|
||||
/* Build the events table for the schematic components list box
|
||||
*/
|
||||
|
||||
BEGIN_EVENT_TABLE( COMPONENTS_LISTBOX, ITEMS_LISTBOX_BASE )
|
||||
EVT_SIZE( ITEMS_LISTBOX_BASE::OnSize )
|
||||
EVT_CHAR( COMPONENTS_LISTBOX::OnChar )
|
||||
EVT_LIST_ITEM_SELECTED( ID_CVPCB_COMPONENT_LIST, COMPONENTS_LISTBOX::OnSelectComponent )
|
||||
END_EVENT_TABLE()
|
||||
|
||||
|
||||
|
@ -53,6 +70,7 @@ void COMPONENTS_LISTBOX::SetString( unsigned linecount, const wxString& text )
|
|||
{
|
||||
if( linecount >= m_ComponentList.Count() )
|
||||
linecount = m_ComponentList.Count() - 1;
|
||||
|
||||
if( linecount >= 0 )
|
||||
m_ComponentList[linecount] = text;
|
||||
}
|
||||
|
@ -65,19 +83,12 @@ void COMPONENTS_LISTBOX::AppendLine( const wxString& text )
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* Overlaid function: MUST be provided in wxLC_VIRTUAL mode
|
||||
* because real data are not handled by ITEMS_LISTBOX_BASE
|
||||
*/
|
||||
wxString COMPONENTS_LISTBOX::OnGetItemText( long item, long column ) const
|
||||
{
|
||||
return m_ComponentList.Item( item );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Enable or disable an item
|
||||
*/
|
||||
void COMPONENTS_LISTBOX::SetSelection( unsigned index, bool State )
|
||||
{
|
||||
if( (int) index >= GetCount() )
|
||||
|
@ -87,6 +98,7 @@ void COMPONENTS_LISTBOX::SetSelection( unsigned index, bool State )
|
|||
{
|
||||
Select( index, State );
|
||||
EnsureVisible( index );
|
||||
|
||||
#ifdef __WXMAC__
|
||||
Update();
|
||||
#endif
|
||||
|
@ -94,73 +106,73 @@ void COMPONENTS_LISTBOX::SetSelection( unsigned index, bool State )
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* Function OnChar
|
||||
* called on a key pressed
|
||||
* Call default handler for some special keys,
|
||||
* and for "ascii" keys, select the first component
|
||||
* that the name starts by the letter.
|
||||
* This is the defaut behaviour of a listbox, but because we use
|
||||
* virtual lists, the listbox does not know anything to what is displayed,
|
||||
* we must handle this behaviour here.
|
||||
* Furthermore the reference of components is not at the beginning of
|
||||
* displayed lines (the first word is the line number)
|
||||
*/
|
||||
void COMPONENTS_LISTBOX::OnChar( wxKeyEvent& event )
|
||||
{
|
||||
int key = event.GetKeyCode();
|
||||
|
||||
switch( key )
|
||||
{
|
||||
case WXK_HOME:
|
||||
case WXK_END:
|
||||
case WXK_UP:
|
||||
case WXK_DOWN:
|
||||
case WXK_PAGEUP:
|
||||
case WXK_PAGEDOWN:
|
||||
event.Skip();
|
||||
return;
|
||||
case WXK_TAB:
|
||||
case WXK_RIGHT:
|
||||
case WXK_NUMPAD_RIGHT:
|
||||
GetParent()->ChangeFocus( true );
|
||||
return;
|
||||
|
||||
case WXK_LEFT:
|
||||
case WXK_NUMPAD_LEFT:
|
||||
GetParent()->m_LibraryList->SetFocus();
|
||||
return;
|
||||
case WXK_LEFT:
|
||||
case WXK_NUMPAD_LEFT:
|
||||
GetParent()->ChangeFocus( false );
|
||||
return;
|
||||
|
||||
case WXK_RIGHT:
|
||||
case WXK_NUMPAD_RIGHT:
|
||||
GetParent()->m_FootprintList->SetFocus();
|
||||
return;
|
||||
case WXK_HOME:
|
||||
case WXK_END:
|
||||
case WXK_UP:
|
||||
case WXK_DOWN:
|
||||
case WXK_PAGEUP:
|
||||
case WXK_PAGEDOWN:
|
||||
event.Skip();
|
||||
return;
|
||||
|
||||
default:
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
// Search for an item name starting by the key code:
|
||||
key = toupper(key);
|
||||
key = toupper( key );
|
||||
|
||||
for( unsigned ii = 0; ii < m_ComponentList.GetCount(); ii++ )
|
||||
{
|
||||
wxString text = m_ComponentList.Item(ii);
|
||||
/* search for the start char of the footprint name.
|
||||
* we must skip the line number
|
||||
*/
|
||||
text.Trim(false); // Remove leading spaces in line
|
||||
wxString text = m_ComponentList.Item( ii );
|
||||
|
||||
// Search for the start char of the footprint name. Skip the line number.
|
||||
text.Trim( false ); // Remove leading spaces in line
|
||||
unsigned jj = 0;
|
||||
|
||||
for( ; jj < text.Len(); jj++ )
|
||||
{ // skip line number
|
||||
if( text[jj] == ' ' )
|
||||
break;
|
||||
}
|
||||
|
||||
for( ; jj < text.Len(); jj++ )
|
||||
{ // skip blanks
|
||||
if( text[jj] != ' ' )
|
||||
break;
|
||||
}
|
||||
int start_char = toupper(text[jj]);
|
||||
if ( key == start_char )
|
||||
|
||||
int start_char = toupper( text[jj] );
|
||||
|
||||
if( key == start_char )
|
||||
{
|
||||
Focus( ii );
|
||||
SetSelection( ii, true ); // Ensure visible
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
void COMPONENTS_LISTBOX::OnSelectComponent( wxListEvent& event )
|
||||
{
|
||||
SetFocus();
|
||||
GetParent()->OnSelectComponent( event );
|
||||
}
|
||||
|
|
|
@ -36,21 +36,14 @@
|
|||
#include <cvpcb.h>
|
||||
#include <cvpcb_mainframe.h>
|
||||
#include <cvstruct.h>
|
||||
#include <cvpcb_id.h>
|
||||
|
||||
|
||||
/***************************************/
|
||||
/* ListBox handling the footprint list */
|
||||
/***************************************/
|
||||
|
||||
FOOTPRINTS_LISTBOX::FOOTPRINTS_LISTBOX( CVPCB_MAINFRAME* parent,
|
||||
wxWindowID id, const wxPoint& loc,
|
||||
const wxSize& size,
|
||||
int nbitems, wxString choice[] ) :
|
||||
const wxSize& size ) :
|
||||
ITEMS_LISTBOX_BASE( parent, id, loc, size )
|
||||
{
|
||||
m_UseFootprintFullList = true;
|
||||
m_ActiveFootprintList = NULL;
|
||||
SetActiveFootprintList( true );
|
||||
}
|
||||
|
||||
|
||||
|
@ -59,24 +52,19 @@ FOOTPRINTS_LISTBOX::~FOOTPRINTS_LISTBOX()
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* Return number of items
|
||||
*/
|
||||
int FOOTPRINTS_LISTBOX::GetCount()
|
||||
{
|
||||
return m_ActiveFootprintList->Count();
|
||||
return m_footprintList.Count();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Change an item text
|
||||
*/
|
||||
void FOOTPRINTS_LISTBOX::SetString( unsigned linecount, const wxString& text )
|
||||
{
|
||||
if( linecount >= m_ActiveFootprintList->Count() )
|
||||
linecount = m_ActiveFootprintList->Count() - 1;
|
||||
if( linecount >= m_footprintList.Count() )
|
||||
linecount = m_footprintList.Count() - 1;
|
||||
|
||||
if( linecount >= 0 )
|
||||
(*m_ActiveFootprintList)[linecount] = text;
|
||||
m_footprintList[linecount] = text;
|
||||
}
|
||||
|
||||
|
||||
|
@ -87,7 +75,7 @@ wxString FOOTPRINTS_LISTBOX::GetSelectedFootprint()
|
|||
|
||||
if( ii >= 0 )
|
||||
{
|
||||
wxString msg = (*m_ActiveFootprintList)[ii];
|
||||
wxString msg = m_footprintList[ii];
|
||||
msg.Trim( true );
|
||||
msg.Trim( false );
|
||||
footprintName = msg.AfterFirst( wxChar( ' ' ) );
|
||||
|
@ -99,24 +87,20 @@ wxString FOOTPRINTS_LISTBOX::GetSelectedFootprint()
|
|||
|
||||
void FOOTPRINTS_LISTBOX::AppendLine( const wxString& text )
|
||||
{
|
||||
m_ActiveFootprintList->Add( text );
|
||||
SetItemCount( m_ActiveFootprintList->Count() );
|
||||
m_footprintList.Add( text );
|
||||
SetItemCount( m_footprintList.Count() );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Overlaid function: MUST be provided in wxLC_VIRTUAL mode
|
||||
* because real data is not handled by ITEMS_LISTBOX_BASE
|
||||
*/
|
||||
wxString FOOTPRINTS_LISTBOX::OnGetItemText( long item, long column ) const
|
||||
{
|
||||
return m_ActiveFootprintList->Item( item );
|
||||
if( item < 0 || item >= (long)m_footprintList.GetCount() )
|
||||
return wxEmptyString;
|
||||
|
||||
return m_footprintList.Item( item );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Enable or disable an item
|
||||
*/
|
||||
void FOOTPRINTS_LISTBOX::SetSelection( unsigned index, bool State )
|
||||
{
|
||||
if( (int) index >= GetCount() )
|
||||
|
@ -127,7 +111,9 @@ void FOOTPRINTS_LISTBOX::SetSelection( unsigned index, bool State )
|
|||
#ifndef __WXMAC__
|
||||
Select( index, State );
|
||||
#endif
|
||||
|
||||
EnsureVisible( index );
|
||||
|
||||
#ifdef __WXMAC__
|
||||
Refresh();
|
||||
#endif
|
||||
|
@ -135,232 +121,78 @@ void FOOTPRINTS_LISTBOX::SetSelection( unsigned index, bool State )
|
|||
}
|
||||
|
||||
|
||||
void FOOTPRINTS_LISTBOX::SetFootprintFullList( FOOTPRINT_LIST& list )
|
||||
void FOOTPRINTS_LISTBOX::SetFootprints( FOOTPRINT_LIST& aList, const wxString& aLibName,
|
||||
COMPONENT* aComponent, int aFilterType )
|
||||
{
|
||||
wxString msg;
|
||||
int oldSelection = GetSelection();
|
||||
wxArrayString newList;
|
||||
wxString msg;
|
||||
wxString oldSelection;
|
||||
|
||||
m_FullFootprintList.Clear();
|
||||
if( GetSelection() >= 0 && GetSelection() < (int)m_footprintList.GetCount() )
|
||||
oldSelection = m_footprintList[ GetSelection() ];
|
||||
|
||||
for( unsigned ii = 0; ii < list.GetCount(); ii++ )
|
||||
for( unsigned ii = 0; ii < aList.GetCount(); ii++ )
|
||||
{
|
||||
FOOTPRINT_INFO & footprint = list.GetItem(ii);
|
||||
msg.Printf( wxT( "%3zu %s" ), m_FullFootprintList.GetCount() + 1,
|
||||
GetChars(footprint.m_Module) );
|
||||
m_FullFootprintList.Add( msg );
|
||||
if( aFilterType == UNFILTERED )
|
||||
{
|
||||
msg.Printf( wxT( "%3zu %s" ), newList.GetCount() + 1,
|
||||
GetChars( aList.GetItem( ii ).m_Module ) );
|
||||
newList.Add( msg );
|
||||
continue;
|
||||
}
|
||||
|
||||
if( (aFilterType & BY_LIBRARY) && !aLibName.IsEmpty()
|
||||
&& !aList.GetItem( ii ).InLibrary( aLibName ) )
|
||||
continue;
|
||||
|
||||
if( (aFilterType & BY_COMPONENT) && (aComponent != NULL)
|
||||
&& !aComponent->MatchesFootprintFilters( aList.GetItem( ii ).m_Module ) )
|
||||
continue;
|
||||
|
||||
if( (aFilterType & BY_PIN_COUNT) && (aComponent!= NULL)
|
||||
&& (aComponent->GetNetCount() != aList.GetItem( ii ).m_padCount) )
|
||||
continue;
|
||||
|
||||
msg.Printf( wxT( "%3zu %s" ), newList.GetCount() + 1,
|
||||
aList.GetItem( ii ).m_Module.GetData() );
|
||||
newList.Add( msg );
|
||||
}
|
||||
|
||||
SetActiveFootprintList( true );
|
||||
if( newList == m_footprintList )
|
||||
return;
|
||||
|
||||
if( GetCount() == 0 || oldSelection < 0 || oldSelection >= GetCount() )
|
||||
SetSelection( 0, true );
|
||||
m_footprintList = newList;
|
||||
|
||||
int selection = m_footprintList.Index( oldSelection );
|
||||
|
||||
if( selection == wxNOT_FOUND )
|
||||
selection = 0;
|
||||
|
||||
DeleteAllItems();
|
||||
SetItemCount( m_footprintList.GetCount() );
|
||||
SetSelection( selection, true );
|
||||
Refresh();
|
||||
}
|
||||
|
||||
|
||||
void FOOTPRINTS_LISTBOX::SetFootprintFilteredList( COMPONENT* aComponent,
|
||||
FOOTPRINT_LIST& list )
|
||||
{
|
||||
wxString msg;
|
||||
unsigned jj;
|
||||
int OldSelection = GetSelection();
|
||||
bool hasItem = false;
|
||||
|
||||
m_FilteredFootprintList.Clear();
|
||||
|
||||
for( unsigned ii = 0; ii < list.GetCount(); ii++ )
|
||||
{
|
||||
FOOTPRINT_INFO& footprint = list.GetItem(ii);
|
||||
// Search for matching footprints
|
||||
// The search is case insensitive
|
||||
wxString module = footprint.m_Module.Upper();
|
||||
wxString candidate;
|
||||
|
||||
for( jj = 0; jj < aComponent->GetFootprintFilters().GetCount(); jj++ )
|
||||
{
|
||||
candidate = aComponent->GetFootprintFilters()[jj].Upper();
|
||||
|
||||
if( !module.Matches( candidate ) )
|
||||
continue;
|
||||
|
||||
msg.Printf( wxT( "%3zu %s" ), m_FilteredFootprintList.GetCount() + 1,
|
||||
footprint.m_Module.GetData() );
|
||||
m_FilteredFootprintList.Add( msg );
|
||||
hasItem = true;
|
||||
}
|
||||
}
|
||||
|
||||
if( hasItem )
|
||||
SetActiveFootprintList( false );
|
||||
else
|
||||
SetActiveFootprintList( true );
|
||||
|
||||
if( ( GetCount() == 0 ) || ( OldSelection >= GetCount() ) )
|
||||
SetSelection( 0, true );
|
||||
|
||||
Refresh();
|
||||
}
|
||||
|
||||
|
||||
void FOOTPRINTS_LISTBOX::SetFootprintFilteredByPinCount( COMPONENT* aComponent,
|
||||
FOOTPRINT_LIST& list )
|
||||
{
|
||||
wxString msg;
|
||||
int oldSelection = GetSelection();
|
||||
bool hasItem = false;
|
||||
|
||||
m_FilteredFootprintList.Clear();
|
||||
|
||||
for( unsigned ii = 0; ii < list.GetCount(); ii++ )
|
||||
{
|
||||
FOOTPRINT_INFO& footprint = list.GetItem(ii);
|
||||
|
||||
if( aComponent->GetNetCount() == footprint.m_padCount )
|
||||
{
|
||||
msg.Printf( wxT( "%3zu %s" ), m_FilteredFootprintList.GetCount() + 1,
|
||||
footprint.m_Module.GetData() );
|
||||
m_FilteredFootprintList.Add( msg );
|
||||
hasItem = true;
|
||||
}
|
||||
}
|
||||
|
||||
if( hasItem )
|
||||
SetActiveFootprintList( false );
|
||||
else
|
||||
SetActiveFootprintList( true );
|
||||
|
||||
if( ( GetCount() == 0 ) || ( oldSelection >= GetCount() ) )
|
||||
SetSelection( 0, true );
|
||||
|
||||
Refresh();
|
||||
}
|
||||
|
||||
void FOOTPRINTS_LISTBOX::SetFootprintFilteredByLibraryList( FOOTPRINT_LIST& list,
|
||||
wxString SelectedLibrary ) {
|
||||
wxString msg;
|
||||
int oldSelection = GetSelection();
|
||||
bool hasItem = false;
|
||||
|
||||
wxFileName filename = SelectedLibrary;
|
||||
filename.SetExt( LegacyFootprintLibPathExtension );
|
||||
wxString FullLibraryName = wxGetApp().FindLibraryPath( filename );
|
||||
|
||||
m_FilteredFootprintList.Clear();
|
||||
|
||||
for( unsigned ii = 0; ii < list.GetCount(); ii++ )
|
||||
{
|
||||
FOOTPRINT_INFO& footprint = list.GetItem(ii);
|
||||
wxString LibName = footprint.m_libPath;
|
||||
if( LibName.Matches( FullLibraryName ) )
|
||||
{
|
||||
msg.Printf( wxT( "%3d %s" ), m_FilteredFootprintList.GetCount() + 1,
|
||||
footprint.m_Module.GetData() );
|
||||
m_FilteredFootprintList.Add( msg );
|
||||
hasItem = true;
|
||||
}
|
||||
}
|
||||
|
||||
if( hasItem )
|
||||
SetActiveFootprintList( false );
|
||||
else
|
||||
SetActiveFootprintList( true );
|
||||
|
||||
if( ( GetCount() == 0 ) || ( oldSelection >= GetCount() ) )
|
||||
SetSelection( 0, true );
|
||||
|
||||
Refresh();
|
||||
}
|
||||
|
||||
/** Set the footprint list. We can have 2 footprint list:
|
||||
* The full footprint list
|
||||
* The filtered footprint list (if the current selected component has a
|
||||
* filter for footprints)
|
||||
* @param FullList true = full footprint list, false = filtered footprint list
|
||||
* @param Redraw = true to redraw the window
|
||||
*/
|
||||
void FOOTPRINTS_LISTBOX::SetActiveFootprintList( bool FullList, bool Redraw )
|
||||
{
|
||||
bool old_selection = m_UseFootprintFullList;
|
||||
|
||||
#ifdef __WINDOWS__
|
||||
|
||||
/* Workaround for a curious bug in wxWidgets:
|
||||
* if we switch from a long list of footprints to a short list (a
|
||||
* filtered footprint list), and if the selected item is near the end
|
||||
* of the long list, the new list is not displayed from the top of
|
||||
* the list box
|
||||
*/
|
||||
if( m_ActiveFootprintList )
|
||||
{
|
||||
bool new_selection;
|
||||
|
||||
if( FullList )
|
||||
new_selection = true;
|
||||
else
|
||||
new_selection = false;
|
||||
|
||||
if( new_selection != old_selection )
|
||||
SetSelection( 0, true );
|
||||
}
|
||||
#endif
|
||||
if( FullList )
|
||||
{
|
||||
m_UseFootprintFullList = true;
|
||||
m_ActiveFootprintList = &m_FullFootprintList;
|
||||
SetItemCount( m_FullFootprintList.GetCount() );
|
||||
}
|
||||
else
|
||||
{
|
||||
m_UseFootprintFullList = false;
|
||||
m_ActiveFootprintList = &m_FilteredFootprintList;
|
||||
SetItemCount( m_FilteredFootprintList.GetCount() );
|
||||
}
|
||||
|
||||
if( Redraw )
|
||||
{
|
||||
if( !m_UseFootprintFullList || ( m_UseFootprintFullList != old_selection ) )
|
||||
{
|
||||
Refresh();
|
||||
}
|
||||
}
|
||||
|
||||
GetParent()->DisplayStatus();
|
||||
}
|
||||
|
||||
|
||||
/**************************************/
|
||||
/* Event table for the footprint list */
|
||||
/**************************************/
|
||||
|
||||
BEGIN_EVENT_TABLE( FOOTPRINTS_LISTBOX, ITEMS_LISTBOX_BASE )
|
||||
EVT_SIZE( ITEMS_LISTBOX_BASE::OnSize )
|
||||
EVT_CHAR( FOOTPRINTS_LISTBOX::OnChar )
|
||||
EVT_LIST_ITEM_SELECTED( ID_CVPCB_FOOTPRINT_LIST, FOOTPRINTS_LISTBOX::OnLeftClick )
|
||||
EVT_LIST_ITEM_ACTIVATED( ID_CVPCB_FOOTPRINT_LIST, FOOTPRINTS_LISTBOX::OnLeftDClick )
|
||||
END_EVENT_TABLE()
|
||||
|
||||
|
||||
void FOOTPRINTS_LISTBOX::OnLeftClick( wxListEvent& event )
|
||||
{
|
||||
FOOTPRINT_INFO* Module;
|
||||
wxString footprintName = GetSelectedFootprint();
|
||||
if( m_footprintList.IsEmpty() )
|
||||
return;
|
||||
|
||||
Module = GetParent()->m_footprints.GetModuleInfo( footprintName );
|
||||
wxASSERT(Module);
|
||||
// If the footprint view window is displayed, update the footprint.
|
||||
if( GetParent()->m_DisplayFootprintFrame )
|
||||
{
|
||||
// Refresh current selected footprint view:
|
||||
GetParent()->CreateScreenCmp();
|
||||
}
|
||||
|
||||
if( Module )
|
||||
{
|
||||
wxString msg;
|
||||
msg = Module->m_Doc;
|
||||
GetParent()->SetStatusText( msg, 0 );
|
||||
|
||||
msg = wxT( "KeyW: " );
|
||||
msg += Module->m_KeyWord;
|
||||
GetParent()->SetStatusText( msg, 1 );
|
||||
}
|
||||
GetParent()->DisplayStatus();
|
||||
}
|
||||
|
||||
|
||||
|
@ -378,37 +210,39 @@ void FOOTPRINTS_LISTBOX::OnChar( wxKeyEvent& event )
|
|||
|
||||
switch( key )
|
||||
{
|
||||
case WXK_LEFT:
|
||||
case WXK_NUMPAD_LEFT:
|
||||
GetParent()->m_ListCmp->SetFocus();
|
||||
return;
|
||||
case WXK_TAB:
|
||||
case WXK_RIGHT:
|
||||
case WXK_NUMPAD_RIGHT:
|
||||
GetParent()->ChangeFocus( true );
|
||||
return;
|
||||
|
||||
case WXK_HOME:
|
||||
case WXK_END:
|
||||
case WXK_UP:
|
||||
case WXK_DOWN:
|
||||
case WXK_PAGEUP:
|
||||
case WXK_PAGEDOWN:
|
||||
case WXK_RIGHT:
|
||||
case WXK_NUMPAD_RIGHT:
|
||||
event.Skip();
|
||||
return;
|
||||
case WXK_LEFT:
|
||||
case WXK_NUMPAD_LEFT:
|
||||
GetParent()->ChangeFocus( false );
|
||||
return;
|
||||
|
||||
default:
|
||||
break;
|
||||
case WXK_HOME:
|
||||
case WXK_END:
|
||||
case WXK_UP:
|
||||
case WXK_DOWN:
|
||||
case WXK_PAGEUP:
|
||||
case WXK_PAGEDOWN:
|
||||
event.Skip();
|
||||
return;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
// Search for an item name starting by the key code:
|
||||
key = toupper(key);
|
||||
key = toupper( key );
|
||||
|
||||
for( unsigned ii = 0; ii < m_ActiveFootprintList->GetCount(); ii++ )
|
||||
for( unsigned ii = 0; ii < m_footprintList.GetCount(); ii++ )
|
||||
{
|
||||
wxString text = m_ActiveFootprintList->Item(ii);
|
||||
wxString text = m_footprintList.Item( ii );
|
||||
|
||||
/* search for the start char of the footprint name.
|
||||
* we must skip the line number
|
||||
*/
|
||||
text.Trim(false); // Remove leading spaces in line
|
||||
// Search for the start char of the footprint name. Skip the line number.
|
||||
text.Trim( false ); // Remove leading spaces in line
|
||||
unsigned jj = 0;
|
||||
|
||||
for( ; jj < text.Len(); jj++ )
|
||||
|
@ -428,7 +262,6 @@ void FOOTPRINTS_LISTBOX::OnChar( wxKeyEvent& event )
|
|||
|
||||
if( key == start_char )
|
||||
{
|
||||
Focus( ii );
|
||||
SetSelection( ii, true ); // Ensure visible
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -33,19 +33,17 @@
|
|||
#include <cvpcb.h>
|
||||
#include <cvpcb_mainframe.h>
|
||||
#include <cvstruct.h>
|
||||
#include <cvpcb_id.h>
|
||||
|
||||
|
||||
/***************************************/
|
||||
/* ListBox handling the library list */
|
||||
/***************************************/
|
||||
|
||||
LIBRARY_LISTBOX::LIBRARY_LISTBOX( CVPCB_MAINFRAME* parent,
|
||||
wxWindowID id, const wxPoint& loc,
|
||||
const wxSize& size,
|
||||
int nbitems, wxString choice[] ) :
|
||||
LIBRARY_LISTBOX::LIBRARY_LISTBOX( CVPCB_MAINFRAME* parent, wxWindowID id,
|
||||
const wxPoint& loc, const wxSize& size ) :
|
||||
ITEMS_LISTBOX_BASE( parent, id, loc, size )
|
||||
{
|
||||
//ListLibraries();
|
||||
}
|
||||
|
||||
|
||||
|
@ -54,24 +52,19 @@ LIBRARY_LISTBOX::~LIBRARY_LISTBOX()
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* Return number of items
|
||||
*/
|
||||
int LIBRARY_LISTBOX::GetCount()
|
||||
{
|
||||
return m_LibraryList.Count();
|
||||
return m_libraryList.Count();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Change an item text
|
||||
*/
|
||||
void LIBRARY_LISTBOX::SetString( unsigned linecount, const wxString& text )
|
||||
{
|
||||
if( linecount >= m_LibraryList.Count() )
|
||||
linecount = m_LibraryList.Count() - 1;
|
||||
if( linecount >= m_libraryList.Count() )
|
||||
linecount = m_libraryList.Count() - 1;
|
||||
|
||||
if( linecount >= 0 )
|
||||
m_LibraryList[linecount] = text;
|
||||
m_libraryList[linecount] = text;
|
||||
}
|
||||
|
||||
|
||||
|
@ -82,7 +75,7 @@ wxString LIBRARY_LISTBOX::GetSelectedLibrary()
|
|||
|
||||
if( ii >= 0 )
|
||||
{
|
||||
libraryName = m_LibraryList[ii];
|
||||
libraryName = m_libraryList[ii];
|
||||
}
|
||||
|
||||
return libraryName;
|
||||
|
@ -91,23 +84,17 @@ wxString LIBRARY_LISTBOX::GetSelectedLibrary()
|
|||
|
||||
void LIBRARY_LISTBOX::AppendLine( const wxString& text )
|
||||
{
|
||||
m_LibraryList.Add( text );
|
||||
SetItemCount( m_LibraryList.Count() );
|
||||
m_libraryList.Add( text );
|
||||
SetItemCount( m_libraryList.Count() );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Overlaid function: MUST be provided in wxLC_VIRTUAL mode
|
||||
* because real data is not handled by ITEMS_LISTBOX_BASE
|
||||
*/
|
||||
wxString LIBRARY_LISTBOX::OnGetItemText( long item, long column ) const
|
||||
{
|
||||
return m_LibraryList.Item( item );
|
||||
return m_libraryList.Item( item );
|
||||
}
|
||||
|
||||
/*
|
||||
* Enable or disable an item
|
||||
*/
|
||||
|
||||
void LIBRARY_LISTBOX::SetSelection( unsigned index, bool State )
|
||||
{
|
||||
if( (int) index >= GetCount() )
|
||||
|
@ -126,83 +113,69 @@ void LIBRARY_LISTBOX::SetSelection( unsigned index, bool State )
|
|||
}
|
||||
|
||||
|
||||
void LIBRARY_LISTBOX::SetLibraryList( wxArrayString list )
|
||||
void LIBRARY_LISTBOX::SetLibraryList( const wxArrayString& aList )
|
||||
{
|
||||
wxString msg;
|
||||
int oldSelection = GetSelection();
|
||||
int oldSelection = GetSelection();
|
||||
|
||||
m_LibraryList.Clear();
|
||||
m_libraryList = aList;
|
||||
|
||||
for( unsigned ii = 0; ii < list.GetCount(); ii++ )
|
||||
{
|
||||
msg = list.Item(ii);
|
||||
m_LibraryList.Add( msg );
|
||||
}
|
||||
|
||||
SetItemCount(list.GetCount());
|
||||
SetItemCount( m_libraryList.GetCount() );
|
||||
|
||||
if( GetCount() == 0 || oldSelection < 0 || oldSelection >= GetCount() )
|
||||
SetSelection( 0, true );
|
||||
|
||||
Refresh();
|
||||
}
|
||||
|
||||
|
||||
/**************************************/
|
||||
/* Event table for the library list */
|
||||
/**************************************/
|
||||
|
||||
BEGIN_EVENT_TABLE( LIBRARY_LISTBOX, ITEMS_LISTBOX_BASE )
|
||||
EVT_SIZE( ITEMS_LISTBOX_BASE::OnSize )
|
||||
EVT_CHAR( LIBRARY_LISTBOX::OnChar )
|
||||
EVT_LIST_ITEM_SELECTED( ID_CVPCB_LIBRARY_LIST, LIBRARY_LISTBOX::OnSelectLibrary )
|
||||
END_EVENT_TABLE()
|
||||
|
||||
|
||||
/**
|
||||
* Function OnChar
|
||||
* called on a key pressed
|
||||
* Call default handler for some special keys,
|
||||
* and for "ascii" keys, select the first footprint
|
||||
* that the name starts by the letter.
|
||||
* This is the defaut behaviour of a listbox, but because we use
|
||||
* virtual lists, the listbox does not know anything to what is displayed,
|
||||
* we must handle this behaviour here.
|
||||
* Furthermore the footprint name is not at the beginning of
|
||||
* displayed lines (the first word is the line number)
|
||||
*/
|
||||
void LIBRARY_LISTBOX::OnChar( wxKeyEvent& event )
|
||||
{
|
||||
int key = event.GetKeyCode();
|
||||
|
||||
switch( key )
|
||||
{
|
||||
case WXK_RIGHT:
|
||||
case WXK_NUMPAD_RIGHT:
|
||||
GetParent()->m_ListCmp->SetFocus();
|
||||
return;
|
||||
case WXK_TAB:
|
||||
case WXK_RIGHT:
|
||||
case WXK_NUMPAD_RIGHT:
|
||||
GetParent()->ChangeFocus( true );
|
||||
return;
|
||||
|
||||
case WXK_HOME:
|
||||
case WXK_END:
|
||||
case WXK_UP:
|
||||
case WXK_DOWN:
|
||||
case WXK_PAGEUP:
|
||||
case WXK_PAGEDOWN:
|
||||
case WXK_LEFT:
|
||||
case WXK_NUMPAD_LEFT:
|
||||
event.Skip();
|
||||
return;
|
||||
case WXK_LEFT:
|
||||
case WXK_NUMPAD_LEFT:
|
||||
GetParent()->ChangeFocus( false );
|
||||
return;
|
||||
|
||||
default:
|
||||
break;
|
||||
case WXK_HOME:
|
||||
case WXK_END:
|
||||
case WXK_UP:
|
||||
case WXK_DOWN:
|
||||
case WXK_PAGEUP:
|
||||
case WXK_PAGEDOWN:
|
||||
event.Skip();
|
||||
return;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
// Search for an item name starting by the key code:
|
||||
key = toupper(key);
|
||||
for( unsigned ii = 0; ii < m_LibraryList.GetCount(); ii++ )
|
||||
|
||||
for( unsigned ii = 0; ii < m_libraryList.GetCount(); ii++ )
|
||||
{
|
||||
wxString text = m_LibraryList.Item(ii);
|
||||
/* search for the start char of the footprint name.
|
||||
* we must skip the line number
|
||||
*/
|
||||
text.Trim(false); // Remove leading spaces in line
|
||||
wxString text = m_libraryList.Item( ii );
|
||||
|
||||
// Search for the start char of the footprint name. Skip the line number.
|
||||
text.Trim( false ); // Remove leading spaces in line
|
||||
unsigned jj = 0;
|
||||
|
||||
for( ; jj < text.Len(); jj++ )
|
||||
{
|
||||
// skip line number
|
||||
|
@ -217,11 +190,18 @@ void LIBRARY_LISTBOX::OnChar( wxKeyEvent& event )
|
|||
}
|
||||
|
||||
int start_char = toupper( text[jj] );
|
||||
|
||||
if( key == start_char )
|
||||
{
|
||||
Focus( ii );
|
||||
SetSelection( ii, true ); // Ensure visible
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void LIBRARY_LISTBOX::OnSelectLibrary( wxListEvent& event )
|
||||
{
|
||||
SetFocus();
|
||||
GetParent()->OnSelectComponent( event );
|
||||
}
|
||||
|
|
|
@ -87,20 +87,11 @@ BEGIN_EVENT_TABLE( CVPCB_MAINFRAME, EDA_BASE_FRAME )
|
|||
CVPCB_MAINFRAME::OnSelectFilteringFootprint )
|
||||
EVT_TOOL( ID_CVPCB_FOOTPRINT_DISPLAY_BY_LIBRARY_LIST,
|
||||
CVPCB_MAINFRAME::OnSelectFilteringFootprint )
|
||||
EVT_TOOL( ID_CVPCB_FOOTPRINT_DISPLAY_FULL_LIST,
|
||||
CVPCB_MAINFRAME::OnSelectFilteringFootprint )
|
||||
|
||||
// Frame events
|
||||
EVT_CHAR( CVPCB_MAINFRAME::OnChar )
|
||||
EVT_CLOSE( CVPCB_MAINFRAME::OnCloseWindow )
|
||||
EVT_SIZE( CVPCB_MAINFRAME::OnSize )
|
||||
|
||||
// List item events
|
||||
EVT_LIST_ITEM_SELECTED( ID_CVPCB_FOOTPRINT_LIST, CVPCB_MAINFRAME::OnLeftClick )
|
||||
EVT_LIST_ITEM_ACTIVATED( ID_CVPCB_FOOTPRINT_LIST, CVPCB_MAINFRAME::OnLeftDClick )
|
||||
EVT_LIST_ITEM_SELECTED( ID_CVPCB_COMPONENT_LIST, CVPCB_MAINFRAME::OnSelectComponent )
|
||||
EVT_LIST_ITEM_SELECTED( ID_CVPCB_LIBRARY_LIST, CVPCB_MAINFRAME::OnSelectComponent )
|
||||
|
||||
EVT_UPDATE_UI( ID_CVPCB_CONFIG_KEEP_OPEN_ON_SAVE, CVPCB_MAINFRAME::OnUpdateKeepOpenOnSave )
|
||||
END_EVENT_TABLE()
|
||||
|
||||
|
@ -111,14 +102,13 @@ CVPCB_MAINFRAME::CVPCB_MAINFRAME( const wxString& title, long style ) :
|
|||
EDA_BASE_FRAME( NULL, CVPCB_FRAME_TYPE, title, wxDefaultPosition,
|
||||
wxDefaultSize, style, CVPCB_MAINFRAME_NAME )
|
||||
{
|
||||
m_FrameName = CVPCB_MAINFRAME_NAME;
|
||||
|
||||
m_ListCmp = NULL;
|
||||
m_FootprintList = NULL;
|
||||
m_LibraryList = NULL;
|
||||
m_FrameName = CVPCB_MAINFRAME_NAME;
|
||||
m_ListCmp = NULL;
|
||||
m_FootprintList = NULL;
|
||||
m_LibraryList = NULL;
|
||||
m_DisplayFootprintFrame = NULL;
|
||||
m_mainToolBar = NULL;
|
||||
m_modified = false;
|
||||
m_mainToolBar = NULL;
|
||||
m_modified = false;
|
||||
m_isEESchemaNetlist = false;
|
||||
m_KeepCvpcbOpen = false;
|
||||
m_undefinedComponentCnt = 0;
|
||||
|
@ -200,22 +190,6 @@ CVPCB_MAINFRAME::CVPCB_MAINFRAME( const wxString& title, long style ) :
|
|||
|
||||
CVPCB_MAINFRAME::~CVPCB_MAINFRAME()
|
||||
{
|
||||
wxConfig* config = wxGetApp().GetSettings();
|
||||
|
||||
if( config )
|
||||
{
|
||||
int state = 0;
|
||||
if( m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST ) )
|
||||
{
|
||||
state = 1;
|
||||
}
|
||||
else if( m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_PIN_FILTERED_LIST ) )
|
||||
{
|
||||
state = 2;
|
||||
}
|
||||
config->Write( wxT( FILTERFOOTPRINTKEY ), state );
|
||||
}
|
||||
|
||||
m_auimgr.UnInit();
|
||||
}
|
||||
|
||||
|
@ -242,6 +216,19 @@ void CVPCB_MAINFRAME::SaveSettings()
|
|||
EDA_BASE_FRAME::SaveSettings();
|
||||
cfg->Write( KeepCvpcbOpenEntry, m_KeepCvpcbOpen );
|
||||
cfg->Write( FootprintDocFileEntry, m_DocModulesFileName );
|
||||
|
||||
int state = 0;
|
||||
|
||||
if( m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST ) )
|
||||
state |= FOOTPRINTS_LISTBOX::BY_COMPONENT;
|
||||
|
||||
if( m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_PIN_FILTERED_LIST ) )
|
||||
state |= FOOTPRINTS_LISTBOX::BY_PIN_COUNT;
|
||||
|
||||
if( m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_BY_LIBRARY_LIST ) )
|
||||
state |= FOOTPRINTS_LISTBOX::BY_LIBRARY;
|
||||
|
||||
cfg->Write( wxT( FILTERFOOTPRINTKEY ), state );
|
||||
}
|
||||
|
||||
|
||||
|
@ -318,83 +305,77 @@ void CVPCB_MAINFRAME::OnCloseWindow( wxCloseEvent& Event )
|
|||
}
|
||||
|
||||
|
||||
void CVPCB_MAINFRAME::OnChar( wxKeyEvent& event )
|
||||
void CVPCB_MAINFRAME::ChangeFocus( bool aMoveRight )
|
||||
{
|
||||
switch( event.GetKeyCode() )
|
||||
wxWindow* hasFocus = wxWindow::FindFocus();
|
||||
|
||||
if( aMoveRight )
|
||||
{
|
||||
case WXK_LEFT:
|
||||
case WXK_NUMPAD_LEFT:
|
||||
m_ListCmp->SetFocus();
|
||||
break;
|
||||
|
||||
case WXK_RIGHT:
|
||||
case WXK_NUMPAD_RIGHT:
|
||||
m_FootprintList->SetFocus();
|
||||
break;
|
||||
|
||||
default:
|
||||
event.Skip();
|
||||
break;
|
||||
if( hasFocus == m_LibraryList )
|
||||
m_ListCmp->SetFocus();
|
||||
else if( hasFocus == m_ListCmp )
|
||||
m_FootprintList->SetFocus();
|
||||
else if( hasFocus == m_FootprintList )
|
||||
m_LibraryList->SetFocus();
|
||||
}
|
||||
else
|
||||
{
|
||||
if( hasFocus == m_LibraryList )
|
||||
m_FootprintList->SetFocus();
|
||||
else if( hasFocus == m_ListCmp )
|
||||
m_LibraryList->SetFocus();
|
||||
else if( hasFocus == m_FootprintList )
|
||||
m_ListCmp->SetFocus();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CVPCB_MAINFRAME::ToFirstNA( wxCommandEvent& event )
|
||||
{
|
||||
int ii = 0;
|
||||
int selection;
|
||||
|
||||
if( m_netlist.IsEmpty() )
|
||||
return;
|
||||
|
||||
selection = m_ListCmp->GetSelection();
|
||||
long selection = m_ListCmp->GetFirstSelected();
|
||||
|
||||
if( selection < 0 )
|
||||
selection = 0;
|
||||
selection = -1; // We will start to 0 for the first search , if no item selected
|
||||
|
||||
for( unsigned jj = 0; jj < m_netlist.GetCount(); jj++ )
|
||||
for( unsigned jj = selection+1; jj < m_netlist.GetCount(); jj++ )
|
||||
{
|
||||
if( m_netlist.GetComponent( jj )->GetFootprintName().IsEmpty() && ii > selection )
|
||||
if( m_netlist.GetComponent( jj )->GetFootprintName().IsEmpty() )
|
||||
{
|
||||
m_ListCmp->SetSelection( ii );
|
||||
m_ListCmp->SetSelection( wxNOT_FOUND, false ); // Remove all selections
|
||||
m_ListCmp->SetSelection( jj );
|
||||
SendMessageToEESCHEMA();
|
||||
return;
|
||||
}
|
||||
|
||||
ii++;
|
||||
}
|
||||
|
||||
m_ListCmp->SetSelection( selection );
|
||||
}
|
||||
|
||||
|
||||
void CVPCB_MAINFRAME::ToPreviousNA( wxCommandEvent& event )
|
||||
{
|
||||
int ii;
|
||||
int selection;
|
||||
|
||||
if( m_netlist.IsEmpty() )
|
||||
return;
|
||||
|
||||
ii = m_ListCmp->GetCount() - 1;
|
||||
selection = m_ListCmp->GetSelection();
|
||||
int selection = m_ListCmp->GetFirstSelected();
|
||||
|
||||
if( selection < 0 )
|
||||
selection = m_ListCmp->GetCount() - 1;
|
||||
selection = m_ListCmp->GetCount();
|
||||
else
|
||||
while( m_ListCmp->GetNextSelected( selection ) >= 0 )
|
||||
selection = m_ListCmp->GetNextSelected( selection );
|
||||
|
||||
for( unsigned kk = m_netlist.GetCount() - 1; kk >= 0; kk-- )
|
||||
for( int kk = selection-1; kk >= 0; kk-- )
|
||||
{
|
||||
if( m_netlist.GetComponent( kk )->GetFootprintName().IsEmpty() && ii < selection )
|
||||
if( m_netlist.GetComponent( kk )->GetFootprintName().IsEmpty() )
|
||||
{
|
||||
m_ListCmp->SetSelection( ii );
|
||||
m_ListCmp->SetSelection( wxNOT_FOUND, false ); // Remove all selections
|
||||
m_ListCmp->SetSelection( kk );
|
||||
SendMessageToEESCHEMA();
|
||||
return;
|
||||
}
|
||||
|
||||
ii--;
|
||||
}
|
||||
|
||||
m_ListCmp->SetSelection( selection );
|
||||
}
|
||||
|
||||
|
||||
|
@ -508,91 +489,46 @@ void CVPCB_MAINFRAME::DisplayDocFile( wxCommandEvent& event )
|
|||
}
|
||||
|
||||
|
||||
void CVPCB_MAINFRAME::OnLeftClick( wxListEvent& event )
|
||||
{
|
||||
m_FootprintList->OnLeftClick( event );
|
||||
}
|
||||
|
||||
|
||||
void CVPCB_MAINFRAME::OnLeftDClick( wxListEvent& event )
|
||||
{
|
||||
m_FootprintList->OnLeftDClick( event );
|
||||
}
|
||||
|
||||
|
||||
/* Called when clicking on a component in component list window
|
||||
* * Updates the filtered footprint list, if the filtered list option is selected
|
||||
* * Updates the current selected footprint in footprint list
|
||||
* * Updates the footprint shown in footprint display window (if opened)
|
||||
*/
|
||||
void CVPCB_MAINFRAME::OnSelectComponent( wxListEvent& event )
|
||||
{
|
||||
if( m_skipComponentSelect )
|
||||
return;
|
||||
|
||||
#define REDRAW_LIST true
|
||||
#define SELECT_FULL_LIST true
|
||||
int selection = -1;
|
||||
wxString SelectedLibrary;
|
||||
wxString libraryName;
|
||||
COMPONENT* component = NULL;
|
||||
int filter = FOOTPRINTS_LISTBOX::UNFILTERED;
|
||||
|
||||
if( !m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST )
|
||||
&& !m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_PIN_FILTERED_LIST )
|
||||
&& !m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_BY_LIBRARY_LIST )
|
||||
)
|
||||
m_FootprintList->SetActiveFootprintList( SELECT_FULL_LIST, REDRAW_LIST );
|
||||
if( m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST ) )
|
||||
filter |= FOOTPRINTS_LISTBOX::BY_COMPONENT;
|
||||
|
||||
else
|
||||
{
|
||||
selection = m_ListCmp->GetSelection();
|
||||
if( m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_PIN_FILTERED_LIST ) )
|
||||
filter |= FOOTPRINTS_LISTBOX::BY_PIN_COUNT;
|
||||
|
||||
if( selection < 0 )
|
||||
m_FootprintList->SetActiveFootprintList( SELECT_FULL_LIST, REDRAW_LIST );
|
||||
if( m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_BY_LIBRARY_LIST ) )
|
||||
filter |= FOOTPRINTS_LISTBOX::BY_LIBRARY;
|
||||
|
||||
else
|
||||
{
|
||||
if( m_netlist.GetComponent( selection ) == NULL )
|
||||
m_FootprintList->SetActiveFootprintList( SELECT_FULL_LIST, REDRAW_LIST );
|
||||
else
|
||||
{
|
||||
if( m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_PIN_FILTERED_LIST ) )
|
||||
{
|
||||
m_FootprintList->SetFootprintFilteredByPinCount( m_netlist.GetComponent( selection ),
|
||||
m_footprints );
|
||||
}
|
||||
else
|
||||
if( m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_BY_LIBRARY_LIST ) )
|
||||
{
|
||||
SelectedLibrary=m_LibraryList->GetSelectedLibrary();
|
||||
m_FootprintList->SetFootprintFilteredByLibraryList( m_footprints, SelectedLibrary );
|
||||
}
|
||||
else
|
||||
{
|
||||
m_FootprintList->SetFootprintFilteredList( m_netlist.GetComponent( selection ),
|
||||
m_footprints );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
component = GetSelectedComponent();
|
||||
libraryName = m_LibraryList->GetSelectedLibrary();
|
||||
m_FootprintList->SetFootprints( m_footprints, libraryName, component, filter );
|
||||
|
||||
selection = m_ListCmp->GetSelection();
|
||||
|
||||
if( selection < 0 )
|
||||
if( component == NULL )
|
||||
return;
|
||||
|
||||
// Preview of the already assigned footprint.
|
||||
// Find the footprint that was already choosen for this component and select it,
|
||||
// but only if the selection is made from the component list.
|
||||
// If the selection is made from the footprint list, do not change the current selected footprint.
|
||||
|
||||
if( FindFocus() == m_ListCmp )
|
||||
// Find the footprint that was already chosen for this component and select it,
|
||||
// but only if the selection is made from the component list or the library list.
|
||||
// If the selection is made from the footprint list, do not change the current
|
||||
// selected footprint.
|
||||
if( FindFocus() == m_ListCmp || FindFocus() == m_LibraryList )
|
||||
{
|
||||
wxString module = m_netlist.GetComponent( selection )->GetFootprintName();
|
||||
wxString module = component->GetFootprintName();
|
||||
|
||||
bool found = false;
|
||||
|
||||
for( int ii = 0; ii < m_FootprintList->GetCount(); ii++ )
|
||||
{
|
||||
wxString footprintName;
|
||||
wxString msg = (*m_FootprintList->m_ActiveFootprintList)[ii];
|
||||
wxString msg = m_FootprintList->OnGetItemText( ii, 0 );
|
||||
msg.Trim( true );
|
||||
msg.Trim( false );
|
||||
footprintName = msg.AfterFirst( wxChar( ' ' ) );
|
||||
|
@ -604,11 +540,14 @@ void CVPCB_MAINFRAME::OnSelectComponent( wxListEvent& event )
|
|||
break;
|
||||
}
|
||||
}
|
||||
if( ! found )
|
||||
|
||||
if( !found )
|
||||
{
|
||||
int ii = m_FootprintList->GetSelection();
|
||||
|
||||
if ( ii >= 0 )
|
||||
m_FootprintList->SetSelection( ii, false );
|
||||
|
||||
if( m_DisplayFootprintFrame )
|
||||
{
|
||||
CreateScreenCmp();
|
||||
|
@ -623,36 +562,6 @@ void CVPCB_MAINFRAME::OnSelectComponent( wxListEvent& event )
|
|||
|
||||
void CVPCB_MAINFRAME::OnSelectFilteringFootprint( wxCommandEvent& event )
|
||||
{
|
||||
switch( event.GetId() )
|
||||
{
|
||||
case ID_CVPCB_FOOTPRINT_DISPLAY_PIN_FILTERED_LIST:
|
||||
m_mainToolBar->ToggleTool( ID_CVPCB_FOOTPRINT_DISPLAY_FULL_LIST, false );
|
||||
m_mainToolBar->ToggleTool( ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST, false );
|
||||
m_mainToolBar->ToggleTool( ID_CVPCB_FOOTPRINT_DISPLAY_BY_LIBRARY_LIST, false );
|
||||
break;
|
||||
|
||||
case ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST:
|
||||
m_mainToolBar->ToggleTool( ID_CVPCB_FOOTPRINT_DISPLAY_FULL_LIST, false );
|
||||
m_mainToolBar->ToggleTool( ID_CVPCB_FOOTPRINT_DISPLAY_PIN_FILTERED_LIST, false );
|
||||
m_mainToolBar->ToggleTool( ID_CVPCB_FOOTPRINT_DISPLAY_BY_LIBRARY_LIST, false );
|
||||
break;
|
||||
|
||||
case ID_CVPCB_FOOTPRINT_DISPLAY_FULL_LIST:
|
||||
m_mainToolBar->ToggleTool( ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST, false );
|
||||
m_mainToolBar->ToggleTool( ID_CVPCB_FOOTPRINT_DISPLAY_PIN_FILTERED_LIST, false );
|
||||
m_mainToolBar->ToggleTool( ID_CVPCB_FOOTPRINT_DISPLAY_BY_LIBRARY_LIST, false );
|
||||
break;
|
||||
|
||||
case ID_CVPCB_FOOTPRINT_DISPLAY_BY_LIBRARY_LIST:
|
||||
m_mainToolBar->ToggleTool( ID_CVPCB_FOOTPRINT_DISPLAY_FULL_LIST, false );
|
||||
m_mainToolBar->ToggleTool( ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST, false );
|
||||
m_mainToolBar->ToggleTool( ID_CVPCB_FOOTPRINT_DISPLAY_PIN_FILTERED_LIST, false );
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
wxListEvent l_event;
|
||||
|
||||
OnSelectComponent( l_event );
|
||||
|
@ -667,35 +576,88 @@ void CVPCB_MAINFRAME::OnUpdateKeepOpenOnSave( wxUpdateUIEvent& event )
|
|||
|
||||
void CVPCB_MAINFRAME::DisplayStatus()
|
||||
{
|
||||
wxString msg;
|
||||
wxString msg;
|
||||
COMPONENT* component;
|
||||
|
||||
msg.Printf( _( "Components: %d (free: %d)" ), (int) m_netlist.GetCount(),
|
||||
m_undefinedComponentCnt );
|
||||
SetStatusText( msg, 0 );
|
||||
|
||||
SetStatusText( wxEmptyString, 1 );
|
||||
|
||||
if( m_FootprintList )
|
||||
if( wxWindow::FindFocus() == m_ListCmp || wxWindow::FindFocus() == m_LibraryList )
|
||||
{
|
||||
if( m_FootprintList->m_UseFootprintFullList )
|
||||
msg.Printf( _( "Footprints (All): %d" ),
|
||||
(int) m_FootprintList->m_ActiveFootprintList->GetCount() );
|
||||
else
|
||||
msg.Printf( _( "Footprints (filtered): %d" ),
|
||||
(int) m_FootprintList->m_ActiveFootprintList->GetCount() );
|
||||
msg.Printf( _( "Components: %d, unassigned: %d" ), (int) m_netlist.GetCount(),
|
||||
m_undefinedComponentCnt );
|
||||
SetStatusText( msg, 0 );
|
||||
|
||||
msg.Empty();
|
||||
|
||||
component = GetSelectedComponent();
|
||||
|
||||
if( component )
|
||||
{
|
||||
for( unsigned ii = 0; ii < component->GetFootprintFilters().GetCount(); ii++ )
|
||||
{
|
||||
if( msg.IsEmpty() )
|
||||
msg += component->GetFootprintFilters()[ii];
|
||||
else
|
||||
msg += wxT( ", " ) + component->GetFootprintFilters()[ii];
|
||||
}
|
||||
|
||||
msg = _( "Filter list: " ) + msg;
|
||||
}
|
||||
|
||||
SetStatusText( msg, 1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
msg.Empty();
|
||||
wxString footprintName = m_FootprintList->GetSelectedFootprint();
|
||||
FOOTPRINT_INFO* module = m_footprints.GetModuleInfo( footprintName );
|
||||
|
||||
if( module ) // can be NULL if no netlist loaded
|
||||
{
|
||||
msg = _( "Description: " ) + module->m_Doc;
|
||||
SetStatusText( msg, 0 );
|
||||
|
||||
msg = _( "Key words: " ) + module->m_KeyWord;
|
||||
SetStatusText( msg, 1 );
|
||||
}
|
||||
}
|
||||
|
||||
SetStatusText( msg, 2 );
|
||||
|
||||
msg.Empty();
|
||||
|
||||
if( m_FootprintList )
|
||||
{
|
||||
if( m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST ) )
|
||||
msg = _( "key words" );
|
||||
|
||||
if( m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_PIN_FILTERED_LIST ) )
|
||||
{
|
||||
if( !msg.IsEmpty() )
|
||||
msg += wxT( ", " );
|
||||
|
||||
msg += _( "pin count" );
|
||||
}
|
||||
|
||||
if( m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_BY_LIBRARY_LIST ) )
|
||||
{
|
||||
if( !msg.IsEmpty() )
|
||||
msg += wxT( ", " );
|
||||
|
||||
msg += _( "library" );
|
||||
}
|
||||
|
||||
if( msg.IsEmpty() )
|
||||
msg = _( "No filtering" );
|
||||
else
|
||||
msg = _( "Filtered by " ) + msg;
|
||||
|
||||
msg << wxT( ": " ) << m_FootprintList->GetCount();
|
||||
|
||||
SetStatusText( msg, 2 );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool CVPCB_MAINFRAME::LoadFootprintFiles()
|
||||
{
|
||||
/* Check if there are footprint libraries in project file */
|
||||
// Check if there are footprint libraries in project file.
|
||||
if( m_ModuleLibNames.GetCount() == 0 )
|
||||
{
|
||||
wxMessageBox( _( "No PCB footprint libraries are listed in the current project file." ),
|
||||
|
@ -705,10 +667,10 @@ bool CVPCB_MAINFRAME::LoadFootprintFiles()
|
|||
|
||||
m_footprints.ReadFootprintFiles( m_ModuleLibNames );
|
||||
|
||||
/* Display error messages, if any */
|
||||
// Display error messages, if any.
|
||||
if( !m_footprints.m_filesNotFound.IsEmpty() || !m_footprints.m_filesInvalid.IsEmpty() )
|
||||
{
|
||||
HTML_MESSAGE_BOX dialog( this, _("Load Error") );
|
||||
HTML_MESSAGE_BOX dialog( this, _( "Load Error" ) );
|
||||
|
||||
if( !m_footprints.m_filesNotFound.IsEmpty() )
|
||||
{
|
||||
|
@ -717,7 +679,7 @@ bool CVPCB_MAINFRAME::LoadFootprintFiles()
|
|||
dialog.ListSet( m_footprints.m_filesNotFound );
|
||||
}
|
||||
|
||||
/* Display if there are invalid files */
|
||||
// Display if there are invalid files.
|
||||
if( !m_footprints.m_filesInvalid.IsEmpty() )
|
||||
{
|
||||
dialog.MessageSet( _( "Some files are invalid!" ) );
|
||||
|
@ -815,7 +777,6 @@ int CVPCB_MAINFRAME::ReadSchematicNetlist()
|
|||
return 1;
|
||||
}
|
||||
|
||||
|
||||
// We also remove footprint name if it is "$noname" because this is a dummy name,
|
||||
// not the actual name of the footprint.
|
||||
for( unsigned ii = 0; ii < m_netlist.GetCount(); ii++ )
|
||||
|
@ -831,7 +792,7 @@ int CVPCB_MAINFRAME::ReadSchematicNetlist()
|
|||
}
|
||||
|
||||
|
||||
/* File header. */
|
||||
// File header.
|
||||
static char HeaderLinkFile[] = { "Cmp-Mod V01" };
|
||||
|
||||
|
||||
|
@ -900,3 +861,86 @@ void CVPCB_MAINFRAME::CreateScreenCmp()
|
|||
|
||||
m_DisplayFootprintFrame->InitDisplay();
|
||||
}
|
||||
|
||||
|
||||
void CVPCB_MAINFRAME::BuildFOOTPRINTS_LISTBOX()
|
||||
{
|
||||
wxFont guiFont = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT );
|
||||
|
||||
if( m_FootprintList == NULL )
|
||||
{
|
||||
m_FootprintList = new FOOTPRINTS_LISTBOX( this, ID_CVPCB_FOOTPRINT_LIST,
|
||||
wxDefaultPosition, wxDefaultSize );
|
||||
m_FootprintList->SetFont( wxFont( guiFont.GetPointSize(),
|
||||
wxFONTFAMILY_MODERN,
|
||||
wxFONTSTYLE_NORMAL,
|
||||
wxFONTWEIGHT_NORMAL ) );
|
||||
}
|
||||
|
||||
m_FootprintList->SetFootprints( m_footprints, wxEmptyString, NULL,
|
||||
FOOTPRINTS_LISTBOX::UNFILTERED );
|
||||
DisplayStatus();
|
||||
}
|
||||
|
||||
|
||||
void CVPCB_MAINFRAME::BuildCmpListBox()
|
||||
{
|
||||
wxString msg;
|
||||
COMPONENT* component;
|
||||
wxFont guiFont = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT );
|
||||
|
||||
if( m_ListCmp == NULL )
|
||||
{
|
||||
m_ListCmp = new COMPONENTS_LISTBOX( this, ID_CVPCB_COMPONENT_LIST,
|
||||
wxDefaultPosition, wxDefaultSize );
|
||||
m_ListCmp->SetFont( wxFont( guiFont.GetPointSize(),
|
||||
wxFONTFAMILY_MODERN,
|
||||
wxFONTSTYLE_NORMAL,
|
||||
wxFONTWEIGHT_NORMAL ) );
|
||||
}
|
||||
|
||||
m_ListCmp->m_ComponentList.Clear();
|
||||
|
||||
for( unsigned i = 0; i < m_netlist.GetCount(); i++ )
|
||||
{
|
||||
component = m_netlist.GetComponent( i );
|
||||
|
||||
msg.Printf( CMP_FORMAT, m_ListCmp->GetCount() + 1,
|
||||
GetChars( component->GetReference() ),
|
||||
GetChars( component->GetValue() ),
|
||||
GetChars( component->GetFootprintName() ) );
|
||||
m_ListCmp->m_ComponentList.Add( msg );
|
||||
}
|
||||
|
||||
m_ListCmp->SetItemCount( m_ListCmp->m_ComponentList.Count() );
|
||||
m_ListCmp->SetSelection( 0, true );
|
||||
}
|
||||
|
||||
|
||||
void CVPCB_MAINFRAME::BuildLIBRARY_LISTBOX()
|
||||
{
|
||||
wxFont guiFont = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT );
|
||||
|
||||
if( m_LibraryList == NULL )
|
||||
{
|
||||
m_LibraryList = new LIBRARY_LISTBOX( this, ID_CVPCB_LIBRARY_LIST,
|
||||
wxDefaultPosition, wxDefaultSize );
|
||||
m_LibraryList->SetFont( wxFont( guiFont.GetPointSize(),
|
||||
wxFONTFAMILY_MODERN,
|
||||
wxFONTSTYLE_NORMAL,
|
||||
wxFONTWEIGHT_NORMAL ) );
|
||||
}
|
||||
|
||||
m_LibraryList->SetLibraryList( m_ModuleLibNames );
|
||||
}
|
||||
|
||||
|
||||
COMPONENT* CVPCB_MAINFRAME::GetSelectedComponent()
|
||||
{
|
||||
int selection = m_ListCmp->GetSelection();
|
||||
|
||||
if( selection >= 0 && selection < (int) m_netlist.GetCount() )
|
||||
return m_netlist.GetComponent( selection );
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -45,6 +45,7 @@ class FOOTPRINTS_LISTBOX;
|
|||
class COMPONENTS_LISTBOX;
|
||||
class LIBRARY_LISTBOX;
|
||||
class DISPLAY_FOOTPRINTS_FRAME;
|
||||
class COMPONENT;
|
||||
|
||||
|
||||
/**
|
||||
|
@ -52,8 +53,9 @@ class DISPLAY_FOOTPRINTS_FRAME;
|
|||
*/
|
||||
class CVPCB_MAINFRAME : public EDA_BASE_FRAME
|
||||
{
|
||||
public:
|
||||
wxArrayString m_footprintListEntries;
|
||||
|
||||
public:
|
||||
bool m_KeepCvpcbOpen;
|
||||
FOOTPRINTS_LISTBOX* m_FootprintList;
|
||||
LIBRARY_LISTBOX* m_LibraryList;
|
||||
|
@ -81,9 +83,6 @@ public:
|
|||
CVPCB_MAINFRAME( const wxString& title, long style = KICAD_DEFAULT_DRAWFRAME_STYLE );
|
||||
~CVPCB_MAINFRAME();
|
||||
|
||||
void OnLeftClick( wxListEvent& event );
|
||||
void OnLeftDClick( wxListEvent& event );
|
||||
|
||||
/**
|
||||
* Function OnSelectComponent
|
||||
* Called when clicking on a component in component list window
|
||||
|
@ -96,10 +95,11 @@ public:
|
|||
void OnQuit( wxCommandEvent& event );
|
||||
void OnCloseWindow( wxCloseEvent& Event );
|
||||
void OnSize( wxSizeEvent& SizeEvent );
|
||||
void OnChar( wxKeyEvent& event );
|
||||
void ReCreateHToolbar();
|
||||
virtual void ReCreateMenuBar();
|
||||
|
||||
void ChangeFocus( bool aMoveRight );
|
||||
|
||||
/**
|
||||
* Function SetLanguage
|
||||
* is called on a language menu selection.
|
||||
|
@ -224,7 +224,15 @@ public:
|
|||
|
||||
/**
|
||||
* Function DisplayStatus
|
||||
* displays info to the status line at bottom of the main frame.
|
||||
* updates the information displayed on the status bar at bottom of the main frame.
|
||||
*
|
||||
* When the library or component list controls have the focus, the footprint assignment
|
||||
* status of the components is displayed in the first status bar pane and the list of
|
||||
* filters for the selected component is displayed in the second status bar pane. When
|
||||
* the footprint list control has the focus, the description of the selected footprint is
|
||||
* displayed in the first status bar pane and the key words for the selected footprint are
|
||||
* displayed in the second status bar pane. The third status bar pane always displays the
|
||||
* current footprint list filtering.
|
||||
*/
|
||||
void DisplayStatus();
|
||||
|
||||
|
@ -275,6 +283,8 @@ public:
|
|||
*/
|
||||
void SendMessageToEESCHEMA();
|
||||
|
||||
COMPONENT* GetSelectedComponent();
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
|
|
114
cvpcb/cvstruct.h
114
cvpcb/cvstruct.h
|
@ -29,6 +29,7 @@
|
|||
#define CVSTRUCT_H
|
||||
|
||||
#include <wx/listctrl.h>
|
||||
|
||||
#include <cvpcb.h>
|
||||
|
||||
/* Forward declarations of all top-level window classes. */
|
||||
|
@ -45,58 +46,64 @@ class ITEMS_LISTBOX_BASE : public wxListView
|
|||
public:
|
||||
ITEMS_LISTBOX_BASE( CVPCB_MAINFRAME* aParent, wxWindowID aId,
|
||||
const wxPoint& aLocation, const wxSize& aSize,
|
||||
long aStyle = wxLC_SINGLE_SEL);
|
||||
long aStyle = wxLC_SINGLE_SEL );
|
||||
|
||||
~ITEMS_LISTBOX_BASE();
|
||||
|
||||
int GetSelection();
|
||||
void OnSize( wxSizeEvent& event );
|
||||
int GetSelection();
|
||||
void OnSize( wxSizeEvent& event );
|
||||
|
||||
virtual CVPCB_MAINFRAME* GetParent();
|
||||
};
|
||||
|
||||
|
||||
/******************************************/
|
||||
/* ListBox showing the list of footprints */
|
||||
/******************************************/
|
||||
|
||||
class FOOTPRINTS_LISTBOX : public ITEMS_LISTBOX_BASE
|
||||
{
|
||||
private:
|
||||
wxArrayString m_FullFootprintList;
|
||||
wxArrayString m_FilteredFootprintList;
|
||||
public:
|
||||
wxArrayString* m_ActiveFootprintList;
|
||||
bool m_UseFootprintFullList;
|
||||
wxArrayString m_footprintList;
|
||||
|
||||
public:
|
||||
enum FP_FILTER_T
|
||||
{
|
||||
UNFILTERED = 0,
|
||||
BY_COMPONENT = 0x0001,
|
||||
BY_PIN_COUNT = 0x0002,
|
||||
BY_LIBRARY = 0x0004,
|
||||
};
|
||||
|
||||
FOOTPRINTS_LISTBOX( CVPCB_MAINFRAME* parent, wxWindowID id,
|
||||
const wxPoint& loc, const wxSize& size,
|
||||
int nbitems, wxString choice[] );
|
||||
const wxPoint& loc, const wxSize& size );
|
||||
~FOOTPRINTS_LISTBOX();
|
||||
|
||||
int GetCount();
|
||||
void SetSelection( unsigned index, bool State = true );
|
||||
void SetString( unsigned linecount, const wxString& text );
|
||||
void AppendLine( const wxString& text );
|
||||
void SetFootprintFullList( FOOTPRINT_LIST& list );
|
||||
void SetFootprintFilteredList( COMPONENT* aComponent,
|
||||
FOOTPRINT_LIST& aList );
|
||||
void SetFootprintFilteredByPinCount( COMPONENT* aComponent,
|
||||
FOOTPRINT_LIST& aList );
|
||||
void SetFootprintFilteredByLibraryList( FOOTPRINT_LIST& list,
|
||||
wxString SelectedLibrary );
|
||||
|
||||
/**
|
||||
* Set the footprint list. We can have 2 footprint list:
|
||||
* The full footprint list
|
||||
* The filtered footprint list (if the current selected component has a
|
||||
* filter for footprints)
|
||||
* @param FullList true = full footprint list, false = filtered footprint list
|
||||
* @param Redraw = true to redraw the window
|
||||
* Function SetFootprints
|
||||
* populates the wxListCtrl with the footprints from \a aList that meet the filter
|
||||
* criteria defined by \a aFilterType.
|
||||
*
|
||||
* @param aList is a #FOOTPRINT_LIST item containing the footprints.
|
||||
* @param aLibName is wxString containing the name of the selected library. Can be
|
||||
* wxEmptyString.
|
||||
* @param aComponent is the #COMPONENT used by the filtering criteria. Can be NULL.
|
||||
* @param aFilterType defines the criteria to filter \a aList.
|
||||
*/
|
||||
void SetActiveFootprintList( bool FullList, bool Redraw = false );
|
||||
void SetFootprints( FOOTPRINT_LIST& aList, const wxString& aLibName,
|
||||
COMPONENT* aComponent, int aFilterType );
|
||||
|
||||
wxString GetSelectedFootprint();
|
||||
|
||||
/**
|
||||
* Function OnGetItemText
|
||||
* this overloaded function MUST be provided for the wxLC_VIRTUAL mode
|
||||
* because real data is not handled by ITEMS_LISTBOX_BASE
|
||||
*/
|
||||
wxString OnGetItemText( long item, long column ) const;
|
||||
|
||||
// Events functions:
|
||||
|
@ -107,43 +114,54 @@ public:
|
|||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
|
||||
/******************************************/
|
||||
/* ListBox showing the list of library */
|
||||
/******************************************/
|
||||
|
||||
class LIBRARY_LISTBOX : public ITEMS_LISTBOX_BASE
|
||||
{
|
||||
//private:
|
||||
|
||||
public:
|
||||
wxArrayString m_LibraryList;
|
||||
wxArrayString m_libraryList;
|
||||
|
||||
public:
|
||||
LIBRARY_LISTBOX( CVPCB_MAINFRAME* parent, wxWindowID id,
|
||||
const wxPoint& loc, const wxSize& size,
|
||||
int nbitems, wxString choice[] );
|
||||
const wxPoint& loc, const wxSize& size );
|
||||
~LIBRARY_LISTBOX();
|
||||
|
||||
int GetCount();
|
||||
void SetSelection( unsigned index, bool State = true );
|
||||
void SetString( unsigned linecount, const wxString& text );
|
||||
void AppendLine( const wxString& text );
|
||||
void SetLibraryList( wxArrayString list );
|
||||
void SetLibraryList( const wxArrayString& aList );
|
||||
|
||||
wxString GetSelectedLibrary();
|
||||
wxString OnGetItemText( long item, long column ) const;
|
||||
|
||||
// Events functions:
|
||||
void OnLeftClick( wxListEvent& event );
|
||||
|
||||
void OnSelectLibrary( wxListEvent& event );
|
||||
|
||||
/**
|
||||
* Function OnChar
|
||||
* called on a key pressed
|
||||
* Call default handler for some special keys,
|
||||
* and for "ascii" keys, select the first footprint
|
||||
* that the name starts by the letter.
|
||||
* This is the defaut behaviour of a listbox, but because we use
|
||||
* virtual lists, the listbox does not know anything to what is displayed,
|
||||
* we must handle this behaviour here.
|
||||
* Furthermore the footprint name is not at the beginning of
|
||||
* displayed lines (the first word is the line number)
|
||||
*/
|
||||
void OnChar( wxKeyEvent& event );
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
|
||||
/****************************************************/
|
||||
/* ListBox showing the list of schematic components */
|
||||
/****************************************************/
|
||||
|
||||
class COMPONENTS_LISTBOX : public ITEMS_LISTBOX_BASE
|
||||
{
|
||||
public:
|
||||
|
@ -153,21 +171,45 @@ public:
|
|||
public:
|
||||
|
||||
COMPONENTS_LISTBOX( CVPCB_MAINFRAME* parent, wxWindowID id,
|
||||
const wxPoint& loc, const wxSize& size,
|
||||
int nbitems, wxString choice[] );
|
||||
const wxPoint& loc, const wxSize& size );
|
||||
|
||||
~COMPONENTS_LISTBOX();
|
||||
|
||||
void Clear();
|
||||
int GetCount();
|
||||
|
||||
/**
|
||||
* Function OnGetItemText
|
||||
* this overloaded function MUST be provided for the wxLC_VIRTUAL mode
|
||||
* because real data is not handled by ITEMS_LISTBOX_BASE
|
||||
*/
|
||||
wxString OnGetItemText( long item, long column ) const;
|
||||
|
||||
/*
|
||||
* Enable or disable an item
|
||||
*/
|
||||
void SetSelection( unsigned index, bool State = true );
|
||||
void SetString( unsigned linecount, const wxString& text );
|
||||
void AppendLine( const wxString& text );
|
||||
|
||||
// Events functions:
|
||||
|
||||
/**
|
||||
* Function OnChar
|
||||
* called on a key pressed
|
||||
* Call default handler for some special keys,
|
||||
* and for "ascii" keys, select the first component
|
||||
* that the name starts by the letter.
|
||||
* This is the default behavior of a listbox, but because we use
|
||||
* virtual lists, the listbox does not know anything to what is displayed,
|
||||
* we must handle this behavior here.
|
||||
* Furthermore the reference of components is not at the beginning of
|
||||
* displayed lines (the first word is the line number)
|
||||
*/
|
||||
void OnChar( wxKeyEvent& event );
|
||||
|
||||
void OnSelectComponent( wxListEvent& event );
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
|
|
|
@ -83,90 +83,3 @@ CVPCB_MAINFRAME* ITEMS_LISTBOX_BASE::GetParent()
|
|||
{
|
||||
return (CVPCB_MAINFRAME*) wxListView::GetParent();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Create or update the schematic components list.
|
||||
*/
|
||||
void CVPCB_MAINFRAME::BuildCmpListBox()
|
||||
{
|
||||
COMPONENT* component;
|
||||
wxString msg;
|
||||
wxSize size( 10, 10 );
|
||||
wxFont guiFont = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT );
|
||||
|
||||
if( m_ListCmp == NULL )
|
||||
{
|
||||
m_ListCmp = new COMPONENTS_LISTBOX( this, ID_CVPCB_COMPONENT_LIST,
|
||||
wxDefaultPosition, size,
|
||||
0, NULL );
|
||||
m_ListCmp->SetFont( wxFont( guiFont.GetPointSize(),
|
||||
wxFONTFAMILY_MODERN,
|
||||
wxFONTSTYLE_NORMAL,
|
||||
wxFONTWEIGHT_NORMAL ) );
|
||||
}
|
||||
|
||||
m_ListCmp->m_ComponentList.Clear();
|
||||
|
||||
for( unsigned i = 0; i < m_netlist.GetCount(); i++ )
|
||||
{
|
||||
component = m_netlist.GetComponent( i );
|
||||
|
||||
msg.Printf( CMP_FORMAT, m_ListCmp->GetCount() + 1,
|
||||
GetChars( component->GetReference() ),
|
||||
GetChars( component->GetValue() ),
|
||||
GetChars( component->GetFootprintName() ) );
|
||||
m_ListCmp->m_ComponentList.Add( msg );
|
||||
}
|
||||
|
||||
m_ListCmp->SetItemCount( m_ListCmp->m_ComponentList.Count() );
|
||||
m_ListCmp->SetSelection( 0, true );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Create or update the footprint list.
|
||||
*/
|
||||
void CVPCB_MAINFRAME::BuildFOOTPRINTS_LISTBOX()
|
||||
{
|
||||
wxString msg;
|
||||
wxSize size( 10, 10 );
|
||||
wxFont guiFont = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT );
|
||||
|
||||
if( m_FootprintList == NULL )
|
||||
{
|
||||
m_FootprintList = new FOOTPRINTS_LISTBOX( this, ID_CVPCB_FOOTPRINT_LIST,
|
||||
wxDefaultPosition, size,
|
||||
0, NULL );
|
||||
m_FootprintList->SetFont( wxFont( guiFont.GetPointSize(),
|
||||
wxFONTFAMILY_MODERN,
|
||||
wxFONTSTYLE_NORMAL,
|
||||
wxFONTWEIGHT_NORMAL ) );
|
||||
}
|
||||
|
||||
m_FootprintList->SetFootprintFullList( m_footprints );
|
||||
DisplayStatus();
|
||||
}
|
||||
|
||||
/*
|
||||
* Create or update the library list.
|
||||
*/
|
||||
void CVPCB_MAINFRAME::BuildLIBRARY_LISTBOX()
|
||||
{
|
||||
wxString msg;
|
||||
wxSize size( 10, 10 );
|
||||
wxFont guiFont = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT );
|
||||
|
||||
if( m_LibraryList == NULL )
|
||||
{
|
||||
m_LibraryList = new LIBRARY_LISTBOX( this, ID_CVPCB_LIBRARY_LIST,
|
||||
wxDefaultPosition, size,
|
||||
0 , NULL );
|
||||
m_LibraryList->SetFont( wxFont( guiFont.GetPointSize(),
|
||||
wxFONTFAMILY_MODERN,
|
||||
wxFONTSTYLE_NORMAL,
|
||||
wxFONTWEIGHT_NORMAL ) );
|
||||
}
|
||||
|
||||
m_LibraryList->SetLibraryList( m_ModuleLibNames );
|
||||
}
|
||||
|
|
|
@ -94,36 +94,30 @@ void CVPCB_MAINFRAME::ReCreateHToolbar()
|
|||
KiBitmap( module_filtered_list_xpm ),
|
||||
wxNullBitmap,
|
||||
true, NULL,
|
||||
_( "Display the filtered footprint list for the current component" ),
|
||||
_( "Filter the footprint list for the current component key words" ),
|
||||
wxEmptyString );
|
||||
|
||||
m_mainToolBar->AddTool( ID_CVPCB_FOOTPRINT_DISPLAY_PIN_FILTERED_LIST,
|
||||
KiBitmap( module_pin_filtered_list_xpm ),
|
||||
wxNullBitmap,
|
||||
true, NULL,
|
||||
_( "Display the filtered footprint list by pin count for the current component" ),
|
||||
_( "Filter the footprint list by pin count for the current component" ),
|
||||
wxEmptyString );
|
||||
|
||||
m_mainToolBar->AddTool( ID_CVPCB_FOOTPRINT_DISPLAY_BY_LIBRARY_LIST,
|
||||
KiBitmap( module_library_list_xpm ),
|
||||
wxNullBitmap, true, NULL,
|
||||
_( "Display the footprint list from selected library" ),
|
||||
wxEmptyString );
|
||||
|
||||
m_mainToolBar->AddTool( ID_CVPCB_FOOTPRINT_DISPLAY_FULL_LIST,
|
||||
KiBitmap( module_full_list_xpm ),
|
||||
wxNullBitmap, true, NULL,
|
||||
_( "Display the full footprint list (without filtering)" ),
|
||||
_( "Filter the footprint list by the selected library" ),
|
||||
wxEmptyString );
|
||||
|
||||
if( config )
|
||||
{
|
||||
wxString key = wxT( FILTERFOOTPRINTKEY );
|
||||
int opt = config->Read( key, (long) 1 );
|
||||
m_mainToolBar->ToggleTool( ID_CVPCB_FOOTPRINT_DISPLAY_BY_LIBRARY_LIST, opt == 3 );
|
||||
m_mainToolBar->ToggleTool( ID_CVPCB_FOOTPRINT_DISPLAY_PIN_FILTERED_LIST, opt == 2 );
|
||||
m_mainToolBar->ToggleTool( ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST, opt == 1 );
|
||||
m_mainToolBar->ToggleTool( ID_CVPCB_FOOTPRINT_DISPLAY_FULL_LIST, opt == 0 );
|
||||
|
||||
m_mainToolBar->ToggleTool( ID_CVPCB_FOOTPRINT_DISPLAY_BY_LIBRARY_LIST, opt & 4 );
|
||||
m_mainToolBar->ToggleTool( ID_CVPCB_FOOTPRINT_DISPLAY_PIN_FILTERED_LIST, opt & 2 );
|
||||
m_mainToolBar->ToggleTool( ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST, opt & 1 );
|
||||
}
|
||||
|
||||
// after adding the buttons to the toolbar, must call Realize() to reflect the changes
|
||||
|
|
|
@ -1,188 +0,0 @@
|
|||
/**
|
||||
* @file BOM_lister.h
|
||||
*/
|
||||
|
||||
/* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2012 Jean-Pierre Charras jp.charras at wanadoo.fr
|
||||
* Copyright (C) 1992-2012 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
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#ifndef _BOM_LISTER_H_
|
||||
#define _BOM_LISTER_H_
|
||||
|
||||
#include <netlist.h>
|
||||
|
||||
|
||||
// A helper class to build item lists for BOM,
|
||||
// and write lists on files
|
||||
class BOM_LISTER
|
||||
{
|
||||
private:
|
||||
BOM_LABEL_LIST m_labelList; // a list of global and hierarchical labels
|
||||
SCH_REFERENCE_LIST m_cmplist; // a flat list of components in the full hierarchy
|
||||
FILE* m_outFile; // the output file for BOM generation
|
||||
char m_separatorSymbol; // the separator used for csv files ( usually \t ; or , )
|
||||
bool m_outputFmtCsv; // true to create Csv files, false to create text lists
|
||||
bool m_includeSubComponents; // true to list each part
|
||||
// of a multiple part per package component
|
||||
// false to list only once this kind of component
|
||||
bool m_csvForm; // true to print less verbose component list
|
||||
// false to print more verbose component list
|
||||
bool m_groupReferences; // true to group in list by reference (when possible,
|
||||
// i.e. when other fields have the same value
|
||||
// false to list one reference per line
|
||||
bool m_printLocation; // true to print component location in list by reference
|
||||
std::vector <int> m_fieldIDactive; // list of field IDs to print
|
||||
|
||||
public:
|
||||
BOM_LISTER()
|
||||
{
|
||||
m_outFile = NULL;
|
||||
m_separatorSymbol = '\t';
|
||||
m_outputFmtCsv = false;
|
||||
m_includeSubComponents = false;
|
||||
m_csvForm = true;
|
||||
m_printLocation = false;
|
||||
m_groupReferences = false;
|
||||
}
|
||||
|
||||
// Accessors:
|
||||
void SetGroupReferences( bool aGroupRef )
|
||||
{
|
||||
m_groupReferences = aGroupRef;
|
||||
}
|
||||
|
||||
void SetPrintLocation( bool aPrintLoc )
|
||||
{
|
||||
m_printLocation = aPrintLoc;
|
||||
}
|
||||
|
||||
void SetIncludeSubCmp( bool aIncludeSubCmp )
|
||||
{
|
||||
m_includeSubComponents = aIncludeSubCmp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Function SetCvsFormOn
|
||||
* prepare parameters to create a BOM list in comma separated value (cvs)
|
||||
* @param aSeparator = the character used as "csv" separator
|
||||
*/
|
||||
void SetCvsFormOn( char aSeparator )
|
||||
{
|
||||
m_csvForm = true;
|
||||
m_separatorSymbol = aSeparator;
|
||||
}
|
||||
|
||||
/**
|
||||
* Function SetCvsFormOff
|
||||
* prepare parameters to create a BOM list in full text readable mode
|
||||
* (not csv format)
|
||||
*/
|
||||
void SetCvsFormOff()
|
||||
{
|
||||
m_csvForm = false;
|
||||
}
|
||||
|
||||
void AddFieldIdToPrintList( int aFieldId );
|
||||
|
||||
void ClearFieldIdPrintList() { m_fieldIDactive.clear(); }
|
||||
|
||||
/**
|
||||
* Function CreateCsvBOMListByValues
|
||||
* print the list of components, grouped by values:
|
||||
* One line by value. The format is something like:
|
||||
* value;quantity;references;other fields
|
||||
* 18pF;2;"C404 C405";SM0402
|
||||
* 22nF/25V;4;"C128 C168 C228 C268";SM0402
|
||||
* @param aFile = the file to write to (will be closed)
|
||||
*/
|
||||
void CreateCsvBOMListByValues( FILE* aFile );
|
||||
|
||||
/**
|
||||
* Function PrintGlobalAndHierarchicalLabelsList
|
||||
* print the list of global and hierarchical labels by sheet or by name
|
||||
* @param aSortBySheet = true to print by sheet name order
|
||||
* false to print by label name order
|
||||
* @param aFile = the file to write to (will be NOT closed)
|
||||
*/
|
||||
void PrintGlobalAndHierarchicalLabelsList( FILE* aFile, bool aSortBySheet );
|
||||
|
||||
/**
|
||||
* Function PrintComponentsListByReferenceHumanReadable
|
||||
* print a BOM list in human readable form
|
||||
* @param aFile = the file to write to (will be NOT closed)
|
||||
*/
|
||||
bool PrintComponentsListByReferenceHumanReadable( FILE* aFile );
|
||||
|
||||
/**
|
||||
* Function PrintComponentsListByReferenceCsvForm
|
||||
* print the list of components ordered by references. Generate 2 formats:
|
||||
* - full component list in csv form
|
||||
* - "short" component list in csv form, grouped by common fields values
|
||||
* (mainly component value)
|
||||
* @param aFile = the file to write to (will be NOT closed)
|
||||
*/
|
||||
bool PrintComponentsListByReferenceCsvForm( FILE* aFile );
|
||||
|
||||
/**
|
||||
* Function PrintComponentsListByValue
|
||||
* print the list of components, sorted by value, one line per component
|
||||
* not useable for csv format (use CreateCsvBOMListByValues instead)
|
||||
* @param aFile = the file to write to (will be NOT closed)
|
||||
*/
|
||||
int PrintComponentsListByValue( FILE* aFile );
|
||||
|
||||
private:
|
||||
|
||||
/**
|
||||
* Helper function isFieldPrintable
|
||||
* @return true if the field aFieldId should be printed.
|
||||
* @param aFieldId = the field Id (FOOTPRIN, FIELD4 ...)
|
||||
*/
|
||||
bool isFieldPrintable( int aFieldId );
|
||||
|
||||
/**
|
||||
* Helper function buildGlobalAndHierarchicalLabelsList
|
||||
* Populate m_labelList with global and hierarchical labels
|
||||
* and sheet pins labels
|
||||
*/
|
||||
void buildGlobalAndHierarchicalLabelsList();
|
||||
|
||||
/**
|
||||
* Helper function returnFieldsString
|
||||
* @return a string containing all selected fields texts,
|
||||
* @param aComponent = the schematic component
|
||||
* separated by the csv separator symbol
|
||||
*/
|
||||
const wxString returnFieldsString( SCH_COMPONENT* aComponent );
|
||||
|
||||
/**
|
||||
* Helper function returnURLItemLocation
|
||||
* @param aPathName = the full sheet name of item
|
||||
* @param aPosition = a position (in internal units) to print
|
||||
* @return a formated string to print the full location:
|
||||
* /sheet name/( X Y position)
|
||||
*/
|
||||
const wxString returnURLItemLocation( const wxString& aPathName,
|
||||
wxPoint aPosition );
|
||||
};
|
||||
|
||||
#endif // _BOM_LISTER_H_
|
|
@ -12,8 +12,11 @@ include_directories(
|
|||
|
||||
set(EESCHEMA_DLGS
|
||||
dialogs/dialog_color_config.cpp
|
||||
dialogs/annotate_dialog.cpp
|
||||
dialogs/dialog_annotate.cpp
|
||||
dialogs/dialog_annotate_base.cpp
|
||||
dialogs/dialog_bom.cpp
|
||||
dialogs/dialog_bom_base.cpp
|
||||
dialogs/dialog_bom_cfg_keywords.cpp
|
||||
dialogs/dialog_lib_edit_text.cpp
|
||||
dialogs/dialog_lib_edit_text_base.cpp
|
||||
dialogs/dialog_edit_component_in_lib.cpp
|
||||
|
@ -203,6 +206,33 @@ make_lexer(
|
|||
template_fieldnames.h
|
||||
)
|
||||
|
||||
make_lexer(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/dialogs/dialog_bom_cfg.keywords
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/dialogs/dialog_bom_cfg_lexer.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/dialogs/dialog_bom_cfg_keywords.cpp
|
||||
T_BOMCFG_T
|
||||
|
||||
# Pass header file with dependency on *_lexer.h as extra_arg
|
||||
/dialogs/dialog_bom_cfg.h
|
||||
)
|
||||
|
||||
# Create a C++ compilable string initializer containing html text into a *.h file:
|
||||
add_custom_command(
|
||||
OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/dialogs/dialog_bom_help_html.h
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
-DinputFile=${CMAKE_CURRENT_SOURCE_DIR}/dialogs/dialog_bom_help.html
|
||||
-DoutputFile=${CMAKE_CURRENT_SOURCE_DIR}/dialogs/dialog_bom_help_html.h
|
||||
-P ${CMAKE_MODULE_PATH}/Html2C.cmake
|
||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/dialogs/dialog_bom_help.html
|
||||
COMMENT "creating ${CMAKE_CURRENT_SOURCE_DIR}/dialogs/dialog_bom_help_html.h
|
||||
from ${CMAKE_CURRENT_SOURCE_DIR}/dialogs/dialog_bom_help.html"
|
||||
)
|
||||
|
||||
set_source_files_properties( dialogs/dialog_bom.cpp
|
||||
PROPERTIES
|
||||
OBJECT_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/dialogs/dialog_bom_help_html.h
|
||||
)
|
||||
|
||||
add_executable(eeschema WIN32 MACOSX_BUNDLE
|
||||
${EESCHEMA_SRCS}
|
||||
${EESCHEMA_COMMON_SRCS}
|
||||
|
|
|
@ -3,6 +3,29 @@
|
|||
* @brief Component annotation.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2004-2013 KiCad Developers, see change_log.txt for contributors.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include <algorithm> // to use sort vector
|
||||
#include <vector>
|
||||
|
||||
|
@ -13,7 +36,6 @@
|
|||
|
||||
#include <netlist.h>
|
||||
#include <class_library.h>
|
||||
#include <protos.h>
|
||||
#include <sch_component.h>
|
||||
#include <lib_pin.h>
|
||||
|
||||
|
|
|
@ -1,736 +0,0 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2012 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
||||
* Copyright (C) 2012 Wayne Stambaugh <stambaughw@verizon.net>
|
||||
* Copyright (C) 1992-2012 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
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file build_BOM.cpp
|
||||
* @brief Code used to generate bill of materials.
|
||||
*/
|
||||
|
||||
#include <algorithm> // to use sort vector
|
||||
#include <vector>
|
||||
|
||||
#include <fctsys.h>
|
||||
#include <sch_sheet.h>
|
||||
#include <sch_component.h>
|
||||
#include <template_fieldnames.h>
|
||||
#include <class_library.h>
|
||||
#include <base_units.h>
|
||||
|
||||
#include <BOM_lister.h>
|
||||
|
||||
/* Creates the list of components, grouped by values:
|
||||
* One line by value. The format is something like:
|
||||
* value;quantity;references;other fields
|
||||
* 18pF;2;"C404 C405";SM0402
|
||||
* 22nF/25V;4;"C128 C168 C228 C268";SM0402
|
||||
* param aFile = the file to write to (will be closed)
|
||||
*/
|
||||
void BOM_LISTER::CreateCsvBOMListByValues( FILE* aFile )
|
||||
{
|
||||
m_outFile = aFile;
|
||||
|
||||
SCH_SHEET_LIST sheetList;
|
||||
|
||||
sheetList.GetComponents( m_cmplist, false );
|
||||
|
||||
// sort component list by ref and remove sub components
|
||||
m_cmplist.RemoveSubComponentsFromList();
|
||||
|
||||
// sort component list by value
|
||||
m_cmplist.SortByValueOnly();
|
||||
|
||||
unsigned int index = 0;
|
||||
|
||||
while( index < m_cmplist.GetCount() )
|
||||
{
|
||||
SCH_COMPONENT* component = m_cmplist[index].GetComponent();
|
||||
wxString referenceListStr;
|
||||
int qty = 1;
|
||||
referenceListStr.append( m_cmplist[index].GetRef() );
|
||||
|
||||
for( unsigned int ii = index + 1; ii < m_cmplist.GetCount(); )
|
||||
{
|
||||
if( *( m_cmplist[ii].GetComponent() ) == *component )
|
||||
{
|
||||
referenceListStr.append( wxT( " " ) + m_cmplist[ii].GetRef() );
|
||||
m_cmplist.RemoveItem( ii );
|
||||
qty++;
|
||||
}
|
||||
else
|
||||
ii++; // Increment index only when current item is not removed from the list
|
||||
}
|
||||
|
||||
// Write value, quantity and list of references
|
||||
fprintf( m_outFile, "%s%c%d%c\"%s\"",
|
||||
TO_UTF8( component->GetField( VALUE )->GetText() ),
|
||||
m_separatorSymbol, qty,
|
||||
m_separatorSymbol, TO_UTF8( referenceListStr ) );
|
||||
|
||||
for( int ii = FOOTPRINT; ii < component->GetFieldCount(); ii++ )
|
||||
{
|
||||
if( isFieldPrintable( ii ) )
|
||||
fprintf( m_outFile, "%c%s", m_separatorSymbol,
|
||||
TO_UTF8( component->GetField( ii )->GetText() ) );
|
||||
}
|
||||
|
||||
fprintf( m_outFile, "\n" );
|
||||
index++;
|
||||
}
|
||||
|
||||
fclose( m_outFile );
|
||||
m_outFile = NULL;
|
||||
}
|
||||
|
||||
|
||||
bool BOM_LISTER::isFieldPrintable( int aFieldId )
|
||||
{
|
||||
for( unsigned ii = 0; ii < m_fieldIDactive.size(); ii++ )
|
||||
if( m_fieldIDactive[ii] == aFieldId )
|
||||
return true;
|
||||
|
||||
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void BOM_LISTER::AddFieldIdToPrintList( int aFieldId )
|
||||
{
|
||||
for( unsigned ii = 0; ii < m_fieldIDactive.size(); ii++ )
|
||||
if( m_fieldIDactive[ii] == aFieldId )
|
||||
return;
|
||||
|
||||
|
||||
|
||||
|
||||
m_fieldIDactive.push_back( aFieldId );
|
||||
}
|
||||
|
||||
|
||||
/* compare function for sorting labels by value, then by sheet
|
||||
*/
|
||||
static bool SortLabelsByValue( const BOM_LABEL& obj1, const BOM_LABEL& obj2 )
|
||||
{
|
||||
int ii = obj1.GetText().CmpNoCase( obj2.GetText() );
|
||||
|
||||
if( ii == 0 )
|
||||
ii = obj1.GetSheetPath().Cmp( obj2.GetSheetPath() );
|
||||
|
||||
return ii < 0;
|
||||
}
|
||||
|
||||
|
||||
/* compare function for sorting labels by sheet, then by alphabetic order
|
||||
*/
|
||||
static bool SortLabelsBySheet( const BOM_LABEL& obj1, const BOM_LABEL& obj2 )
|
||||
{
|
||||
int ii = obj1.GetSheetPath().Cmp( obj2.GetSheetPath() );
|
||||
|
||||
if( ii == 0 )
|
||||
ii = obj1.GetText().CmpNoCase( obj2.GetText() );
|
||||
|
||||
return ii < 0;
|
||||
}
|
||||
|
||||
|
||||
// Creates the flat list of global, hierachycal labels and pin sheets
|
||||
// and populate m_labelList
|
||||
void BOM_LISTER::buildGlobalAndHierarchicalLabelsList()
|
||||
{
|
||||
m_labelList.clear();
|
||||
|
||||
// Explore the flat sheet list
|
||||
SCH_SHEET_LIST sheetList;
|
||||
|
||||
for( SCH_SHEET_PATH* path = sheetList.GetFirst(); path; path = sheetList.GetNext() )
|
||||
{
|
||||
SCH_ITEM* schItem = (SCH_ITEM*) path->LastDrawList();
|
||||
|
||||
for( ; schItem; schItem = schItem->Next() )
|
||||
{
|
||||
switch( schItem->Type() )
|
||||
{
|
||||
case SCH_HIERARCHICAL_LABEL_T:
|
||||
case SCH_GLOBAL_LABEL_T:
|
||||
m_labelList.push_back( BOM_LABEL( schItem->Type(), schItem, *path ) );
|
||||
break;
|
||||
|
||||
case SCH_SHEET_T:
|
||||
{
|
||||
SCH_SHEET* sheet = (SCH_SHEET*) schItem;
|
||||
|
||||
BOOST_FOREACH( SCH_SHEET_PIN & sheetPin, sheet->GetPins() ) {
|
||||
m_labelList.push_back( BOM_LABEL( SCH_SHEET_PIN_T,
|
||||
&sheetPin, *path ) );
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Print the flat list of global, hierachycal labels and pin sheets
|
||||
// contained by m_labelList
|
||||
void BOM_LISTER::PrintGlobalAndHierarchicalLabelsList( FILE* aFile, bool aSortBySheet )
|
||||
{
|
||||
m_outFile = aFile;
|
||||
|
||||
buildGlobalAndHierarchicalLabelsList();
|
||||
|
||||
wxString msg;
|
||||
|
||||
if( aSortBySheet )
|
||||
{
|
||||
sort( m_labelList.begin(), m_labelList.end(), SortLabelsBySheet );
|
||||
msg.Printf( _(
|
||||
"\n#Global, Hierarchical Labels and PinSheets \
|
||||
( order = Sheet Number ) count = %d\n" ),
|
||||
m_labelList.size() );
|
||||
}
|
||||
else
|
||||
{
|
||||
sort( m_labelList.begin(), m_labelList.end(), SortLabelsByValue );
|
||||
msg.Printf( _(
|
||||
"\n#Global, Hierarchical Labels and PinSheets ( \
|
||||
order = Alphab. ) count = %d\n\n" ),
|
||||
m_labelList.size() );
|
||||
}
|
||||
|
||||
fprintf( m_outFile, "%s", TO_UTF8( msg ) );
|
||||
|
||||
SCH_LABEL* label;
|
||||
SCH_SHEET_PIN* pinsheet;
|
||||
wxString sheetpath;
|
||||
wxString labeltype;
|
||||
|
||||
for( unsigned ii = 0; ii < m_labelList.size(); ii++ )
|
||||
{
|
||||
switch( m_labelList[ii].GetType() )
|
||||
{
|
||||
case SCH_HIERARCHICAL_LABEL_T:
|
||||
case SCH_GLOBAL_LABEL_T:
|
||||
label = (SCH_LABEL*) ( m_labelList[ii].GetLabel() );
|
||||
|
||||
if( m_labelList[ii].GetType() == SCH_HIERARCHICAL_LABEL_T )
|
||||
labeltype = wxT( "Hierarchical" );
|
||||
else
|
||||
labeltype = wxT( "Global " );
|
||||
|
||||
sheetpath = m_labelList[ii].GetSheetPath().PathHumanReadable();
|
||||
msg.Printf( wxT( "> %-28.28s %s %s\n" ),
|
||||
GetChars( label->GetText() ),
|
||||
GetChars( labeltype ),
|
||||
GetChars( returnURLItemLocation( sheetpath, label->GetPosition() ) ) );
|
||||
|
||||
fputs( TO_UTF8( msg ), m_outFile );
|
||||
break;
|
||||
|
||||
case SCH_SHEET_PIN_T:
|
||||
pinsheet = (SCH_SHEET_PIN*) m_labelList[ii].GetLabel();
|
||||
labeltype = FROM_UTF8( SheetLabelType[pinsheet->GetShape()] );
|
||||
|
||||
msg.Printf( _( "> %-28.28s PinSheet %-7.7s %s\n" ),
|
||||
GetChars( pinsheet->GetText() ),
|
||||
GetChars( labeltype ),
|
||||
GetChars( returnURLItemLocation( m_labelList[ii].GetSheetPath().
|
||||
PathHumanReadable(),
|
||||
pinsheet->GetPosition() ) ) );
|
||||
|
||||
fputs( TO_UTF8( msg ), m_outFile );
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
msg = _( "#End labels\n" );
|
||||
fputs( TO_UTF8( msg ), m_outFile );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Helper function
|
||||
* returns a string containing all selected fields texts,
|
||||
* separated by the csv separator symbol (csv form) or a ;
|
||||
*/
|
||||
const wxString BOM_LISTER::returnFieldsString( SCH_COMPONENT* aComponent )
|
||||
{
|
||||
wxString outStr;
|
||||
wxString tmpStr;
|
||||
wxString text;
|
||||
|
||||
for( int ii = FOOTPRINT; ii <= FIELD8; ii++ )
|
||||
{
|
||||
if( !isFieldPrintable( ii ) )
|
||||
continue;
|
||||
|
||||
if( aComponent->GetFieldCount() > ii )
|
||||
text = aComponent->GetField( ii )->GetText();
|
||||
else
|
||||
text = wxEmptyString;
|
||||
|
||||
if( m_csvForm )
|
||||
tmpStr.Printf( wxT( "%c%s" ), m_separatorSymbol, GetChars( text ) );
|
||||
else
|
||||
tmpStr.Printf( wxT( "; %-12s" ), GetChars( text ) );
|
||||
|
||||
outStr += tmpStr;
|
||||
}
|
||||
|
||||
return outStr;
|
||||
}
|
||||
|
||||
|
||||
/* print the list of components ordered by references,
|
||||
* full component list in human readable form
|
||||
* param aFile = the file to write to (will be NOT closed)
|
||||
*/
|
||||
|
||||
/* full list in human readable form sample:
|
||||
* #Cmp ( order = Reference )with sub-composants
|
||||
* | C101 47pF Loc /(X=344,170 mm, Y=116,840 mm); C1 ; field1 ;
|
||||
* | C102 47pF Loc /(X=364,490 mm, Y=116,840 mm); C1 ; ;
|
||||
* | C103 47uF Loc /(X=66,040 mm, Y=231,140 mm); CP6 ; ;
|
||||
*/
|
||||
|
||||
bool BOM_LISTER::PrintComponentsListByReferenceHumanReadable( FILE* aFile )
|
||||
{
|
||||
m_outFile = aFile;
|
||||
bool addDatasheet = isFieldPrintable( DATASHEET );
|
||||
|
||||
// Print component location if needed, but only when
|
||||
// include sub component option is enabled, because for multiple
|
||||
// parts per package there are more than one location per reference
|
||||
bool printLocCmp = m_printLocation && m_includeSubComponents;
|
||||
|
||||
wxString msg;
|
||||
|
||||
if( m_cmplist.GetCount() == 0 ) // Build component list
|
||||
{
|
||||
SCH_SHEET_LIST sheetList;
|
||||
sheetList.GetComponents( m_cmplist, false );
|
||||
|
||||
// sort component list
|
||||
m_cmplist.SortByReferenceOnly();
|
||||
|
||||
if( !m_includeSubComponents )
|
||||
m_cmplist.RemoveSubComponentsFromList();
|
||||
}
|
||||
else
|
||||
m_cmplist.SortByReferenceOnly();
|
||||
|
||||
// Print comment line:
|
||||
msg = _( "#Cmp ( order = Reference )" );
|
||||
|
||||
if( m_includeSubComponents )
|
||||
msg << _( " (with SubCmp)" );
|
||||
|
||||
fprintf( m_outFile, "%s\n", TO_UTF8( msg ) );
|
||||
|
||||
wxString subReference; // Unit ident, for mutiple parts per package
|
||||
std::string CmpName;
|
||||
|
||||
// Print list of items
|
||||
for( unsigned ii = 0; ii < m_cmplist.GetCount(); ii++ )
|
||||
{
|
||||
EDA_ITEM* item = m_cmplist[ii].GetComponent();
|
||||
|
||||
if( item == NULL )
|
||||
continue;
|
||||
|
||||
if( item->Type() != SCH_COMPONENT_T )
|
||||
continue;
|
||||
|
||||
SCH_COMPONENT* comp = (SCH_COMPONENT*) item;
|
||||
|
||||
bool isMulti = false;
|
||||
|
||||
LIB_COMPONENT* entry = CMP_LIBRARY::FindLibraryComponent( comp->GetLibName() );
|
||||
|
||||
if( entry )
|
||||
isMulti = entry->IsMulti();
|
||||
|
||||
CmpName = m_cmplist[ii].GetRefStr();
|
||||
|
||||
if( isMulti && m_includeSubComponents )
|
||||
{
|
||||
subReference = LIB_COMPONENT::ReturnSubReference( m_cmplist[ii].GetUnit() );
|
||||
CmpName += TO_UTF8( subReference );
|
||||
}
|
||||
|
||||
fprintf( m_outFile, "| %-10s %-12s", CmpName.c_str(),
|
||||
TO_UTF8( comp->GetField( VALUE )->GetText() ) );
|
||||
|
||||
if( addDatasheet )
|
||||
fprintf( m_outFile, "%-20s",
|
||||
TO_UTF8( comp->GetField( DATASHEET )->GetText() ) );
|
||||
|
||||
if( m_includeSubComponents )
|
||||
{
|
||||
if( printLocCmp )
|
||||
{
|
||||
msg = returnURLItemLocation( m_cmplist[ii].GetSheetPath().PathHumanReadable(),
|
||||
comp->GetPosition() );
|
||||
fprintf( m_outFile, "%s", TO_UTF8( msg ) );
|
||||
}
|
||||
}
|
||||
|
||||
wxString tmpStr = returnFieldsString( comp );
|
||||
fprintf( m_outFile, "%s\n", TO_UTF8( tmpStr ) );
|
||||
}
|
||||
|
||||
// Print the last line:
|
||||
fputs( "#End Cmp\n", m_outFile );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/* print the list of components ordered by references. Generate 2 formats:
|
||||
* - full component list in csv form
|
||||
* - "short" component list in csv form, grouped by common fields values
|
||||
* (mainly component value)
|
||||
* param aFile = the file to write to (will be NOT closed)
|
||||
*/
|
||||
|
||||
/* full csv format sample:
|
||||
* ref;value;sheet path(location);footprint;field1;field2
|
||||
* C101;47pF;Loc /(X=57,150 mm, Y=74,930 mm);Loc /(X=344,170 mm, Y=116,840 mm));C1;field1;
|
||||
* C102;47pF;Loc /(X=344,170 mm, Y=116,840 mm);Loc /(X=364,490 mm, Y=116,840 mm));C1;;
|
||||
* C103;47uF;Loc /(X=364,490 mm, Y=116,840 mm);Loc /(X=66,040 mm, Y=231,140 mm));CP6;;
|
||||
* C104;47uF;Loc /(X=66,040 mm, Y=231,140 mm);Loc /(X=82,550 mm, Y=231,140 mm));CP6;;
|
||||
*/
|
||||
/* short csv format sample:
|
||||
* ref;value;footprint;Champ1;Champ2
|
||||
* C101;47pF;C1;field1;;1
|
||||
* C102;47pF;C1;;;1
|
||||
* C103..C106;47uF;CP6;;;4
|
||||
*/
|
||||
|
||||
bool BOM_LISTER::PrintComponentsListByReferenceCsvForm( FILE* aFile )
|
||||
{
|
||||
m_outFile = aFile;
|
||||
bool addDatasheet = isFieldPrintable( DATASHEET );
|
||||
|
||||
// Set option group references, for components having same field values
|
||||
// (same value, same footprint ...)
|
||||
// obviously, this is possible only when print location
|
||||
// and include Sub Components are not enabled.
|
||||
bool groupRefs = m_groupReferences;
|
||||
bool includeSubComponents = m_includeSubComponents && !groupRefs;
|
||||
|
||||
// Print component location if needed, but only when
|
||||
// include sub component option is enabled, because for multiple
|
||||
// parts per package there are more than one location per reference
|
||||
bool printLocCmp = m_printLocation && !groupRefs && m_includeSubComponents;
|
||||
|
||||
wxString msg;
|
||||
|
||||
if( m_cmplist.GetCount() == 0 ) // Build component list
|
||||
{
|
||||
SCH_SHEET_LIST sheetList;
|
||||
sheetList.GetComponents( m_cmplist, false );
|
||||
|
||||
// sort component list
|
||||
m_cmplist.SortByReferenceOnly();
|
||||
|
||||
if( !includeSubComponents )
|
||||
m_cmplist.RemoveSubComponentsFromList();
|
||||
}
|
||||
else
|
||||
m_cmplist.SortByReferenceOnly();
|
||||
|
||||
// Print comment line:
|
||||
msg = wxT( "ref" );
|
||||
msg << (wxChar)m_separatorSymbol << wxT( "value" );
|
||||
|
||||
if( addDatasheet )
|
||||
msg << (wxChar)m_separatorSymbol << wxT( "datasheet" );
|
||||
|
||||
if( printLocCmp )
|
||||
msg << (wxChar)m_separatorSymbol << wxT( "sheet path(location)" );
|
||||
|
||||
if( isFieldPrintable( FOOTPRINT ) )
|
||||
msg << (wxChar)m_separatorSymbol << wxT( "footprint" );
|
||||
|
||||
for( int ii = FIELD1; ii <= FIELD8; ii++ )
|
||||
{
|
||||
if( isFieldPrintable( ii ) )
|
||||
msg << (wxChar)m_separatorSymbol << _( "Field" ) << ii - FIELD1 + 1;
|
||||
}
|
||||
|
||||
if( groupRefs )
|
||||
msg << (wxChar)m_separatorSymbol << _( "Item count" );
|
||||
|
||||
fprintf( m_outFile, "%s\n", TO_UTF8( msg ) );
|
||||
|
||||
// Print BOM list
|
||||
wxString strCur;
|
||||
wxString strPred;
|
||||
int amount = 0; // number of items, on the same line
|
||||
wxString cmpName;
|
||||
wxString cmpNameFirst;
|
||||
wxString cmpNameLast;
|
||||
|
||||
// Print list of items, by reference
|
||||
for( unsigned ii = 0; ii < m_cmplist.GetCount(); ii++ )
|
||||
{
|
||||
EDA_ITEM* item = m_cmplist[ii].GetComponent();
|
||||
|
||||
if( item == NULL )
|
||||
continue;
|
||||
|
||||
if( item->Type() != SCH_COMPONENT_T )
|
||||
continue;
|
||||
|
||||
SCH_COMPONENT* comp = (SCH_COMPONENT*) item;
|
||||
|
||||
LIB_COMPONENT* entry = CMP_LIBRARY::FindLibraryComponent( comp->GetLibName() );
|
||||
|
||||
bool isMulti = false;
|
||||
|
||||
if( entry )
|
||||
isMulti = entry->IsMulti();
|
||||
|
||||
cmpName = m_cmplist[ii].GetRef();
|
||||
|
||||
if( isMulti && includeSubComponents )
|
||||
// Add unit ident, for mutiple parts per package
|
||||
cmpName += LIB_COMPONENT::ReturnSubReference( m_cmplist[ii].GetUnit() );
|
||||
|
||||
if( groupRefs )
|
||||
{
|
||||
// Store value and datasheet (will be printed later)
|
||||
strCur.Empty();
|
||||
strCur << (wxChar)m_separatorSymbol << comp->GetField( VALUE )->GetText();
|
||||
|
||||
if( addDatasheet )
|
||||
strCur << (wxChar)m_separatorSymbol << comp->GetField( DATASHEET )->GetText();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Print the current component reference, value and datasheet
|
||||
msg = cmpName;
|
||||
msg << (wxChar)m_separatorSymbol << comp->GetField( VALUE )->GetText();
|
||||
|
||||
if( addDatasheet )
|
||||
msg << (wxChar)m_separatorSymbol << comp->GetField( DATASHEET )->GetText();
|
||||
|
||||
fprintf( m_outFile, "%s", TO_UTF8( msg ) );
|
||||
}
|
||||
|
||||
if( printLocCmp ) // Is allowed only for full list (not grouped)
|
||||
{
|
||||
msg = returnURLItemLocation(
|
||||
m_cmplist[ii].GetSheetPath().PathHumanReadable(),
|
||||
comp->GetPosition() );
|
||||
|
||||
fprintf( m_outFile, "%c%s", m_separatorSymbol, TO_UTF8( msg ) );
|
||||
}
|
||||
|
||||
if( groupRefs )
|
||||
{
|
||||
wxString tmpStr = returnFieldsString( comp );
|
||||
strCur += tmpStr;
|
||||
|
||||
if( strPred.Len() == 0 )
|
||||
cmpNameFirst = cmpName;
|
||||
else
|
||||
{
|
||||
// print a BOM line
|
||||
msg.Empty();
|
||||
if( !strCur.IsSameAs( strPred ) )
|
||||
{
|
||||
switch( amount )
|
||||
{
|
||||
case 1: // One reference to print
|
||||
// format C103;47uF;CP6;;;1
|
||||
msg << cmpNameFirst <<strPred << (wxChar)m_separatorSymbol << amount;
|
||||
break;
|
||||
|
||||
case 2: // 2 references to print
|
||||
// format C103,C104;47uF;CP6;;;2
|
||||
msg << cmpNameFirst << wxT(",") << cmpNameLast
|
||||
<< strPred << (wxChar)m_separatorSymbol << amount;
|
||||
break;
|
||||
|
||||
default: // Many references to print :
|
||||
// format: C103..C106;47uF;CP6;;;4
|
||||
msg << cmpNameFirst << wxT("..") << cmpNameLast
|
||||
<< strPred << (wxChar)m_separatorSymbol << amount;
|
||||
break;
|
||||
}
|
||||
fprintf( m_outFile, "%s\n", TO_UTF8( msg ) );
|
||||
|
||||
cmpNameFirst = cmpName;
|
||||
amount = 0;
|
||||
}
|
||||
}
|
||||
|
||||
strPred = strCur;
|
||||
cmpNameLast = cmpName;
|
||||
amount++;
|
||||
}
|
||||
else
|
||||
{
|
||||
msg = returnFieldsString( comp );
|
||||
fprintf( m_outFile, "%s\n", TO_UTF8( msg ) );
|
||||
}
|
||||
}
|
||||
|
||||
// Print the last line:
|
||||
if( groupRefs )
|
||||
{
|
||||
msg.Empty();
|
||||
switch( amount )
|
||||
{
|
||||
case 1:
|
||||
msg << cmpNameFirst << strPred << (wxChar)m_separatorSymbol << amount;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
msg << cmpNameFirst << wxT(",") << cmpNameLast
|
||||
<< strPred << (wxChar)m_separatorSymbol << amount;
|
||||
break;
|
||||
|
||||
default:
|
||||
msg << cmpNameFirst << wxT("..") << cmpNameFirst << cmpNameLast
|
||||
<< strPred << (wxChar)m_separatorSymbol << amount;
|
||||
break;
|
||||
}
|
||||
fprintf( m_outFile, "%s\n", TO_UTF8( msg ) );
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/* PrintComponentsListByValue
|
||||
* print the list of components, sorted by value, one line per component
|
||||
* param aFile = the file to write to (will be NOT closed)
|
||||
* not useable for csv format (use CreateCsvBOMListByValues instead)
|
||||
* format:
|
||||
* | 10pF C15 Loc /controle/(X=48,260 mm, Y=83,820 mm); <fields>
|
||||
* | 10pF C16 Loc /controle/(X=68,580 mm, Y=83,820 mm); <fields>
|
||||
*/
|
||||
int BOM_LISTER::PrintComponentsListByValue( FILE* aFile )
|
||||
{
|
||||
m_outFile = aFile;
|
||||
|
||||
if( m_cmplist.GetCount() == 0 ) // Build component list
|
||||
{
|
||||
SCH_SHEET_LIST sheetList;
|
||||
sheetList.GetComponents( m_cmplist, false );
|
||||
|
||||
if( !m_includeSubComponents )
|
||||
{
|
||||
// sort component list
|
||||
m_cmplist.SortByReferenceOnly();
|
||||
m_cmplist.RemoveSubComponentsFromList();
|
||||
}
|
||||
}
|
||||
|
||||
m_cmplist.SortByValueOnly();
|
||||
|
||||
wxString msg;
|
||||
|
||||
msg = _( "\n#Cmp ( order = Value )" );
|
||||
|
||||
if( m_includeSubComponents )
|
||||
msg << _( " (with SubCmp)" );
|
||||
|
||||
msg << wxT( "\n" );
|
||||
|
||||
fputs( TO_UTF8( msg ), m_outFile );
|
||||
|
||||
std::string cmpName;
|
||||
for( unsigned ii = 0; ii < m_cmplist.GetCount(); ii++ )
|
||||
{
|
||||
EDA_ITEM* schItem = m_cmplist[ii].GetComponent();
|
||||
|
||||
if( schItem == NULL )
|
||||
continue;
|
||||
|
||||
if( schItem->Type() != SCH_COMPONENT_T )
|
||||
continue;
|
||||
|
||||
SCH_COMPONENT* drawLibItem = (SCH_COMPONENT*) schItem;
|
||||
|
||||
bool isMulti = false;
|
||||
LIB_COMPONENT* entry = CMP_LIBRARY::FindLibraryComponent( drawLibItem->GetLibName() );
|
||||
|
||||
if( entry )
|
||||
isMulti = entry->IsMulti();
|
||||
|
||||
cmpName = m_cmplist[ii].GetRefStr();
|
||||
|
||||
if( isMulti && m_includeSubComponents )
|
||||
// Add unit ident, for mutiple parts per package
|
||||
cmpName += TO_UTF8( LIB_COMPONENT::ReturnSubReference( m_cmplist[ii].GetUnit() ) );
|
||||
|
||||
fprintf( m_outFile, "| %-12s %-10s",
|
||||
TO_UTF8( drawLibItem->GetField( VALUE )->GetText() ),
|
||||
cmpName.c_str() );
|
||||
|
||||
// print the sheet path and location
|
||||
if( m_includeSubComponents )
|
||||
{
|
||||
msg = returnURLItemLocation( m_cmplist[ii].GetSheetPath().PathHumanReadable(),
|
||||
drawLibItem->GetPosition() );
|
||||
fprintf( m_outFile, "%s", TO_UTF8( msg ) );
|
||||
}
|
||||
|
||||
fprintf( m_outFile, "%s\n", TO_UTF8( returnFieldsString( drawLibItem ) ) );
|
||||
}
|
||||
|
||||
msg = _( "#End Cmp\n" );
|
||||
fputs( TO_UTF8( msg ), m_outFile );
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* returnURLItemLocation
|
||||
* return a formated string to print the full location:
|
||||
* <sheet name>/( X Y position)
|
||||
* param aPathName = the full sheet name of item
|
||||
* param aPosition = a position (in internal units) to print
|
||||
*/
|
||||
const wxString BOM_LISTER::returnURLItemLocation( const wxString& aPathName,
|
||||
wxPoint aPosition )
|
||||
{
|
||||
wxString text;
|
||||
|
||||
text.Printf( wxT( "Loc %s(X=%s, Y=%s)" ), GetChars( aPathName ),
|
||||
GetChars( ReturnStringFromValue( g_UserUnit, aPosition.x, true ) ),
|
||||
GetChars( ReturnStringFromValue( g_UserUnit, aPosition.y, true ) ) );
|
||||
return text;
|
||||
}
|
|
@ -67,7 +67,6 @@ bool SCH_REFERENCE_LIST::sortByXPosition( const SCH_REFERENCE& item1,
|
|||
return ii < 0;
|
||||
}
|
||||
|
||||
|
||||
bool SCH_REFERENCE_LIST::sortByYPosition( const SCH_REFERENCE& item1,
|
||||
const SCH_REFERENCE& item2 )
|
||||
{
|
||||
|
@ -106,252 +105,6 @@ bool SCH_REFERENCE_LIST::sortByRefAndValue( const SCH_REFERENCE& item1,
|
|||
return ii < 0;
|
||||
}
|
||||
|
||||
bool SCH_REFERENCE_LIST::sortByValueAndRef( const SCH_REFERENCE& item1,
|
||||
const SCH_REFERENCE& item2 )
|
||||
{
|
||||
int ii = item1.CompareValue( item2 );
|
||||
|
||||
if( ii == 0 )
|
||||
ii = RefDesStringCompare( item1.GetRef(), item2.GetRef() );
|
||||
|
||||
if( ii == 0 )
|
||||
ii = item1.m_Unit - item2.m_Unit;
|
||||
|
||||
if( ii == 0 )
|
||||
ii = item1.m_SheetNum - item2.m_SheetNum;
|
||||
|
||||
if( ii == 0 )
|
||||
ii = item1.m_CmpPos.x - item2.m_CmpPos.x;
|
||||
|
||||
if( ii == 0 )
|
||||
ii = item1.m_CmpPos.y - item2.m_CmpPos.y;
|
||||
|
||||
if( ii == 0 )
|
||||
ii = item1.m_TimeStamp - item2.m_TimeStamp;
|
||||
|
||||
return ii < 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Helper function to calculate in a component value string
|
||||
* the value, depending on multiplier symbol:
|
||||
* pico
|
||||
* nano
|
||||
* micro (u)
|
||||
* milli (m)
|
||||
* kilo (k ou K)
|
||||
* Mega
|
||||
* Giga
|
||||
* Tera
|
||||
*
|
||||
* with notations like 1K; 1.5K; 1,5K; 1k5
|
||||
* returns true if the string is a value, false if not
|
||||
* (a value is a string starting by a number)
|
||||
*/
|
||||
|
||||
static bool engStrToDouble( wxString aStr, double* aDouble )
|
||||
{
|
||||
// A trick to take care of strings without a multiplier
|
||||
aStr.Append( wxT( "R" ) );
|
||||
|
||||
// Regular expression for a value string, e.g., 47k2
|
||||
#if defined(KICAD_GOST)
|
||||
static wxRegEx valueRegEx( wxT( "^([0-9]+)(мк|[pnumRkKMGT.,кнМГ])([0-9]*)(мк*|[pnumRkKMGTкнМГ]*)" ) );
|
||||
#else
|
||||
static wxRegEx valueRegEx( wxT( "^([0-9]+)([pnumRkKMGT.,])([0-9]*)([pnumRkKMGT]*)" ) );
|
||||
#endif
|
||||
|
||||
if( !valueRegEx.Matches( aStr ) )
|
||||
return false;
|
||||
|
||||
wxString valueStr = wxString( valueRegEx.GetMatch( aStr, 1 )
|
||||
+ wxT( "." )
|
||||
+ valueRegEx.GetMatch( aStr, 3 ) );
|
||||
wxString multiplierString = valueRegEx.GetMatch( aStr, 2 );
|
||||
#if defined(KICAD_GOST)
|
||||
if ( multiplierString == wxT( "мк" ) )
|
||||
multiplierString = wxT( "u" );
|
||||
else if ( multiplierString == wxT( "к" ) )
|
||||
multiplierString = wxT( "k" );
|
||||
else if ( multiplierString == wxT( "н" ) )
|
||||
multiplierString = wxT( "n" );
|
||||
else if ( multiplierString == wxT( "М" ) )
|
||||
multiplierString = wxT( "M" );
|
||||
else if ( multiplierString == wxT( "Г" ) )
|
||||
multiplierString = wxT( "G" );
|
||||
#endif
|
||||
wxString post_multiplierString = valueRegEx.GetMatch( aStr, 4 );
|
||||
#if defined(KICAD_GOST)
|
||||
if ( post_multiplierString == wxT( "мк" ) )
|
||||
multiplierString = wxT( "u" );
|
||||
else if ( post_multiplierString == wxT( "к" ) )
|
||||
multiplierString = wxT( "k" );
|
||||
else if ( post_multiplierString == wxT( "н" ) )
|
||||
multiplierString = wxT( "n" );
|
||||
else if ( post_multiplierString == wxT( "М" ) )
|
||||
multiplierString = wxT( "M" );
|
||||
else if ( post_multiplierString == wxT( "Г" ) )
|
||||
multiplierString = wxT( "G" );
|
||||
#endif
|
||||
double multiplier;
|
||||
|
||||
switch( (wxChar)multiplierString[0] )
|
||||
{
|
||||
case 'p':
|
||||
multiplier = 1e-12;
|
||||
break;
|
||||
case 'n':
|
||||
multiplier = 1e-9;
|
||||
break;
|
||||
case 'u':
|
||||
multiplier = 1e-6;
|
||||
break;
|
||||
case 'm':
|
||||
multiplier = 1e-3;
|
||||
break;
|
||||
case 'k':
|
||||
case 'K':
|
||||
multiplier = 1e3;
|
||||
break;
|
||||
case 'M':
|
||||
multiplier = 1e6;
|
||||
break;
|
||||
case 'G':
|
||||
multiplier = 1e9;
|
||||
break;
|
||||
case 'T':
|
||||
multiplier = 1e12;
|
||||
break;
|
||||
case 'R':
|
||||
case '.': // floating point separator
|
||||
case ',': // floating point separator (some languages)
|
||||
default:
|
||||
multiplier = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
switch( (wxChar)post_multiplierString[0] )
|
||||
{
|
||||
case 'p':
|
||||
multiplier = 1e-12;
|
||||
break;
|
||||
case 'n':
|
||||
multiplier = 1e-9;
|
||||
break;
|
||||
case 'u':
|
||||
multiplier = 1e-6;
|
||||
break;
|
||||
case 'm':
|
||||
multiplier = 1e-3;
|
||||
break;
|
||||
case 'k':
|
||||
case 'K':
|
||||
multiplier = 1e3;
|
||||
break;
|
||||
case 'M':
|
||||
multiplier = 1e6;
|
||||
break;
|
||||
case 'G':
|
||||
multiplier = 1e9;
|
||||
break;
|
||||
case 'T':
|
||||
multiplier = 1e12;
|
||||
break;
|
||||
case 'R':
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
LOCALE_IO dummy; // set to C floating point standard
|
||||
valueStr.ToDouble( aDouble );
|
||||
*aDouble *= multiplier;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
static bool splitRefStr( const wxString& aRef, wxString* aStr, int* aNumber )
|
||||
{
|
||||
static wxRegEx refRegEx( wxT( "^([a-zA-Z]+)([0-9]+)" ) );
|
||||
|
||||
if( !refRegEx.Matches( aRef ) )
|
||||
return false;
|
||||
|
||||
*aStr = refRegEx.GetMatch( aRef, 1 );
|
||||
*aNumber = wxAtoi( refRegEx.GetMatch( aRef, 2 ) );
|
||||
return true;
|
||||
}
|
||||
|
||||
/* sort the list of references by value.
|
||||
* Components are grouped by type and are sorted by value:
|
||||
* The value of a component accept multiplier symbols (p, n, K ..)
|
||||
* groups are made by first letter of reference
|
||||
*/
|
||||
bool SCH_REFERENCE_LIST::sortByValueOnly( const SCH_REFERENCE& item1,
|
||||
const SCH_REFERENCE& item2 )
|
||||
{
|
||||
// First, group by type according to reference text part (R, C, etc.)
|
||||
wxString text1 = item1.GetComponent()->GetField( REFERENCE )->GetText();
|
||||
wxString text2 = item2.GetComponent()->GetField( REFERENCE )->GetText();
|
||||
wxString refNameStr1, refNameStr2;
|
||||
int refNumber1, refNumber2;
|
||||
|
||||
if( !splitRefStr( text1, &refNameStr1, &refNumber1 ) )
|
||||
return false;
|
||||
|
||||
if( !splitRefStr( text2, &refNameStr2, &refNumber2 ) )
|
||||
return false;
|
||||
|
||||
int ii = refNameStr1.CmpNoCase( refNameStr2 );
|
||||
|
||||
if( ii != 0 )
|
||||
return ii < 0;
|
||||
|
||||
// We can compare here 2 values relative to components of the same type
|
||||
// assuming references are correctly chosen
|
||||
text1 = item1.GetComponent()->GetField( VALUE )->GetText();
|
||||
text2 = item2.GetComponent()->GetField( VALUE )->GetText();
|
||||
|
||||
double value1, value2;
|
||||
|
||||
// Try to convert value to double (4k7 -> 4700 etc.)
|
||||
bool match1 = engStrToDouble( text1, &value1 );
|
||||
bool match2 = engStrToDouble( text2, &value2 );
|
||||
|
||||
// Values come before other strings
|
||||
if( match1 && !match2 )
|
||||
return true;
|
||||
|
||||
// Values come before other strings
|
||||
if( !match1 && match2 )
|
||||
return false;
|
||||
|
||||
if( match1 && match2 && (value1 != value2) )
|
||||
return value1 < value2;
|
||||
|
||||
// Inside a group of components of same value, it could be good to group per footprints
|
||||
text1 = item1.GetComponent()->GetField( FOOTPRINT )->GetText();
|
||||
text2 = item2.GetComponent()->GetField( FOOTPRINT )->GetText();
|
||||
ii = text1.CmpNoCase( text2 );
|
||||
|
||||
if( ii != 0 )
|
||||
return ii < 0;
|
||||
|
||||
if( refNumber1 != refNumber2 )
|
||||
return refNumber1 < refNumber2;
|
||||
|
||||
// Fall back to normal string compare
|
||||
ii = text1.CmpNoCase( text2 );
|
||||
|
||||
if( ii == 0 )
|
||||
ii = RefDesStringCompare( item1.GetRef(), item2.GetRef() );
|
||||
|
||||
if( ii == 0 )
|
||||
ii = item1.m_Unit - item2.m_Unit;
|
||||
|
||||
return ii < 0;
|
||||
}
|
||||
|
||||
|
||||
bool SCH_REFERENCE_LIST::sortByReferenceOnly( const SCH_REFERENCE& item1,
|
||||
const SCH_REFERENCE& item2 )
|
||||
|
@ -385,7 +138,6 @@ bool SCH_REFERENCE_LIST::sortByTimeStamp( const SCH_REFERENCE& item1,
|
|||
return ii < 0;
|
||||
}
|
||||
|
||||
|
||||
int SCH_REFERENCE_LIST::FindUnit( size_t aIndex, int aUnit )
|
||||
{
|
||||
int NumRef;
|
||||
|
@ -713,14 +465,14 @@ int SCH_REFERENCE_LIST::CheckAnnotation( wxArrayString* aMessageList )
|
|||
&& ( componentFlatList[ii].m_Unit < 0x7FFFFFFF ) )
|
||||
{
|
||||
msg.Printf( _( "Item not annotated: %s%s (unit %d)\n" ),
|
||||
GetChars( componentFlatList[ii].GetRef() ),
|
||||
GetChars( componentFlatList[ii].GetRef() ),
|
||||
GetChars( tmp ),
|
||||
componentFlatList[ii].m_Unit );
|
||||
}
|
||||
else
|
||||
{
|
||||
msg.Printf( _( "Item not annotated: %s%s\n" ),
|
||||
GetChars( componentFlatList[ii].GetRef() ),
|
||||
GetChars( componentFlatList[ii].GetRef() ),
|
||||
GetChars( tmp ) );
|
||||
}
|
||||
|
||||
|
@ -782,15 +534,15 @@ int SCH_REFERENCE_LIST::CheckAnnotation( wxArrayString* aMessageList )
|
|||
if( ( componentFlatList[ii].m_Unit > 0 )
|
||||
&& ( componentFlatList[ii].m_Unit < 0x7FFFFFFF ) )
|
||||
{
|
||||
msg.Printf( _( "Multiple item %s%s (unit %d)\n" ),
|
||||
GetChars( componentFlatList[ii].GetRef() ),
|
||||
msg.Printf( _( "Multiple item %s%s (unit %d)\n" ),
|
||||
GetChars( componentFlatList[ii].GetRef() ),
|
||||
GetChars( tmp ),
|
||||
componentFlatList[ii].m_Unit );
|
||||
}
|
||||
else
|
||||
{
|
||||
msg.Printf( _( "Multiple item %s%s\n" ),
|
||||
GetChars( componentFlatList[ii].GetRef() ),
|
||||
GetChars( componentFlatList[ii].GetRef() ),
|
||||
GetChars( tmp ) );
|
||||
}
|
||||
|
||||
|
@ -814,15 +566,15 @@ int SCH_REFERENCE_LIST::CheckAnnotation( wxArrayString* aMessageList )
|
|||
if( ( componentFlatList[ii].m_Unit > 0 )
|
||||
&& ( componentFlatList[ii].m_Unit < 0x7FFFFFFF ) )
|
||||
{
|
||||
msg.Printf( _( "Multiple item %s%s (unit %d)\n" ),
|
||||
GetChars( componentFlatList[ii].GetRef() ),
|
||||
msg.Printf( _( "Multiple item %s%s (unit %d)\n" ),
|
||||
GetChars( componentFlatList[ii].GetRef() ),
|
||||
GetChars( tmp ),
|
||||
componentFlatList[ii].m_Unit );
|
||||
}
|
||||
else
|
||||
{
|
||||
msg.Printf( _( "Multiple item %s%s\n" ),
|
||||
GetChars( componentFlatList[ii].GetRef() ),
|
||||
GetChars( componentFlatList[ii].GetRef() ),
|
||||
GetChars( tmp ) );
|
||||
}
|
||||
|
||||
|
@ -837,27 +589,17 @@ int SCH_REFERENCE_LIST::CheckAnnotation( wxArrayString* aMessageList )
|
|||
|
||||
if( componentFlatList[ii].CompareValue( componentFlatList[next] ) != 0 )
|
||||
{
|
||||
#if defined(KICAD_GOST)
|
||||
msg.Printf( _( "Different values for %s%d.%d (%s) and %s%d.%d (%s)" ),
|
||||
msg.Printf( _( "Different values for %s%d%s (%s) and %s%d%s (%s)" ),
|
||||
GetChars( componentFlatList[ii].GetRef() ),
|
||||
componentFlatList[ii].m_NumRef,
|
||||
componentFlatList[ii].m_Unit,
|
||||
GetChars( LIB_COMPONENT::ReturnSubReference(
|
||||
componentFlatList[ii].m_Unit ) ),
|
||||
GetChars( componentFlatList[ii].m_Value->GetText() ),
|
||||
GetChars( componentFlatList[next].GetRef() ),
|
||||
componentFlatList[next].m_NumRef,
|
||||
componentFlatList[next].m_Unit,
|
||||
componentFlatList[next].m_Value->GetText().GetData() );
|
||||
#else
|
||||
msg.Printf( _( "Different values for %s%d%c (%s) and %s%d%c (%s)" ),
|
||||
GetChars( componentFlatList[ii].GetRef() ),
|
||||
componentFlatList[ii].m_NumRef,
|
||||
componentFlatList[ii].m_Unit + 'A' - 1,
|
||||
GetChars( componentFlatList[ii].m_Value->GetText() ),
|
||||
GetChars( componentFlatList[next].GetRef() ),
|
||||
componentFlatList[next].m_NumRef,
|
||||
componentFlatList[next].m_Unit + 'A' - 1,
|
||||
GetChars( LIB_COMPONENT::ReturnSubReference(
|
||||
componentFlatList[next].m_Unit ) ),
|
||||
GetChars( componentFlatList[next].m_Value->GetText() ) );
|
||||
#endif
|
||||
|
||||
if( aMessageList )
|
||||
aMessageList->Add( msg + wxT( "\n" ));
|
||||
|
|
|
@ -1,71 +0,0 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 1992-2012 KiCad Developers, see change_log.txt for contributors.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#ifndef _ANNOTATE_DIALOG_H_
|
||||
#define _ANNOTATE_DIALOG_H_
|
||||
|
||||
#include <dialog_annotate_base.h>
|
||||
|
||||
|
||||
class SCH_EDIT_FRAME;
|
||||
class wxConfig;
|
||||
|
||||
|
||||
/*!
|
||||
* DIALOG_ANNOTATE class declaration
|
||||
*/
|
||||
|
||||
class DIALOG_ANNOTATE: public DIALOG_ANNOTATE_BASE
|
||||
{
|
||||
private:
|
||||
SCH_EDIT_FRAME * m_Parent;
|
||||
wxConfig* m_Config;
|
||||
|
||||
public:
|
||||
DIALOG_ANNOTATE( SCH_EDIT_FRAME* parent );
|
||||
~DIALOG_ANNOTATE(){};
|
||||
|
||||
private:
|
||||
/// Initialises member variables
|
||||
void InitValues();
|
||||
void OnCancelClick( wxCommandEvent& event );
|
||||
void OnClearAnnotationCmpClick( wxCommandEvent& event );
|
||||
void OnApplyClick( wxCommandEvent& event );
|
||||
|
||||
// User functions:
|
||||
bool GetLevel( void );
|
||||
bool GetResetItems( void );
|
||||
int GetSortOrder( void );
|
||||
int GetAnnotateAlgo( void );
|
||||
bool GetAnnotateAutoCloseOpt()
|
||||
{
|
||||
return m_cbAutoCloseDlg->GetValue();
|
||||
}
|
||||
bool GetAnnotateSilentMode()
|
||||
{
|
||||
return m_cbUseSilentMode->GetValue();
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
// _ANNOTATE_DIALOG_H_
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* @file annotate_dialog.cpp
|
||||
* @file dialog_annotate.cpp
|
||||
* @brief Annotation dialog functions.
|
||||
*/
|
||||
|
||||
|
@ -33,75 +33,132 @@
|
|||
#include <wxEeschemaStruct.h>
|
||||
#include <class_drawpanel.h>
|
||||
|
||||
#include <annotate_dialog.h>
|
||||
#include <invoke_sch_dialog.h>
|
||||
#include <dialog_annotate_base.h>
|
||||
|
||||
|
||||
#define KEY_ANNOTATE_SORT_OPTION wxT( "AnnotateSortOption" )
|
||||
#define KEY_ANNOTATE_ALGO_OPTION wxT( "AnnotateAlgoOption" )
|
||||
#define KEY_ANNOTATE_AUTOCLOSE_OPTION wxT( "AnnotateAutoCloseOption" )
|
||||
#define KEY_ANNOTATE_USE_SILENTMODE wxT( "AnnotateSilentMode" )
|
||||
|
||||
|
||||
class wxConfig;
|
||||
|
||||
|
||||
/**
|
||||
* Class DIALOG_ANNOTATE
|
||||
*/
|
||||
class DIALOG_ANNOTATE: public DIALOG_ANNOTATE_BASE
|
||||
{
|
||||
public:
|
||||
DIALOG_ANNOTATE( SCH_EDIT_FRAME* parent );
|
||||
|
||||
|
||||
private:
|
||||
SCH_EDIT_FRAME* m_Parent;
|
||||
wxConfig* m_Config;
|
||||
|
||||
/// Initialises member variables
|
||||
void InitValues();
|
||||
void OnCancelClick( wxCommandEvent& event );
|
||||
void OnClearAnnotationCmpClick( wxCommandEvent& event );
|
||||
void OnApplyClick( wxCommandEvent& event );
|
||||
|
||||
// User functions:
|
||||
bool GetLevel();
|
||||
bool GetResetItems();
|
||||
|
||||
/**
|
||||
* Function GetSortOrder
|
||||
* @return 0 if annotation by X position,
|
||||
* 1 if annotation by Y position,
|
||||
* 2 if annotation by value
|
||||
*/
|
||||
int GetSortOrder();
|
||||
|
||||
/**
|
||||
* Function GetAnnotateAlgo
|
||||
* @return 0 if annotation using first not used Id value
|
||||
* 1 if annotation using first not used Id value inside sheet num * 100 to sheet num * 100 + 99
|
||||
* 2 if annotation using first nhot used Id value inside sheet num * 1000 to sheet num * 1000 + 999
|
||||
*/
|
||||
int GetAnnotateAlgo();
|
||||
|
||||
bool GetAnnotateAutoCloseOpt()
|
||||
{
|
||||
return m_cbAutoCloseDlg->GetValue();
|
||||
}
|
||||
|
||||
bool GetAnnotateSilentMode()
|
||||
{
|
||||
return m_cbUseSilentMode->GetValue();
|
||||
}
|
||||
};
|
||||
|
||||
#define KEY_ANNOTATE_SORT_OPTION wxT("AnnotateSortOption")
|
||||
#define KEY_ANNOTATE_ALGO_OPTION wxT("AnnotateAlgoOption")
|
||||
#define KEY_ANNOTATE_AUTOCLOSE_OPTION wxT("AnnotateAutoCloseOption")
|
||||
#define KEY_ANNOTATE_USE_SILENTMODE wxT("AnnotateSilentMode")
|
||||
|
||||
|
||||
DIALOG_ANNOTATE::DIALOG_ANNOTATE( SCH_EDIT_FRAME* parent )
|
||||
: DIALOG_ANNOTATE_BASE( parent )
|
||||
{
|
||||
m_Parent = parent;
|
||||
|
||||
InitValues();
|
||||
Layout();
|
||||
GetSizer()->SetSizeHints(this);
|
||||
GetSizer()->SetSizeHints( this );
|
||||
Centre();
|
||||
}
|
||||
|
||||
|
||||
/*********************************/
|
||||
void DIALOG_ANNOTATE::InitValues()
|
||||
/*********************************/
|
||||
{
|
||||
m_Config = wxGetApp().GetSettings();
|
||||
SetFocus(); // needed to close dialog by escape key
|
||||
|
||||
if( m_Config )
|
||||
{
|
||||
long option;
|
||||
m_Config->Read(KEY_ANNOTATE_SORT_OPTION, &option, 0l);
|
||||
|
||||
m_Config->Read( KEY_ANNOTATE_SORT_OPTION, &option, 0l );
|
||||
switch( option )
|
||||
{
|
||||
default:
|
||||
case 0:
|
||||
m_rbSortBy_X_Position->SetValue(1);
|
||||
break;
|
||||
default:
|
||||
case 0:
|
||||
m_rbSortBy_X_Position->SetValue( 1 );
|
||||
break;
|
||||
|
||||
case 1:
|
||||
m_rbSortBy_Y_Position->SetValue(1);
|
||||
break;
|
||||
case 1:
|
||||
m_rbSortBy_Y_Position->SetValue( 1 );
|
||||
break;
|
||||
|
||||
case 2:
|
||||
m_rbUseIncremental->SetValue(1);
|
||||
break;
|
||||
}
|
||||
|
||||
m_Config->Read(KEY_ANNOTATE_ALGO_OPTION, &option, 0l);
|
||||
switch( option )
|
||||
{
|
||||
default:
|
||||
case 0:
|
||||
m_rbUseIncremental->SetValue(1);
|
||||
break;
|
||||
|
||||
case 1:
|
||||
m_rbUseSheetNum->SetValue(1);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
m_rbStartSheetNumLarge->SetValue(1);
|
||||
break;
|
||||
case 2:
|
||||
m_rbUseIncremental->SetValue( 1 );
|
||||
break;
|
||||
}
|
||||
|
||||
m_Config->Read(KEY_ANNOTATE_AUTOCLOSE_OPTION, &option, 0l);
|
||||
if( option )
|
||||
m_cbAutoCloseDlg->SetValue(1);
|
||||
m_Config->Read( KEY_ANNOTATE_ALGO_OPTION, &option, 0l );
|
||||
switch( option )
|
||||
{
|
||||
default:
|
||||
case 0:
|
||||
m_rbUseIncremental->SetValue( 1 );
|
||||
break;
|
||||
|
||||
m_Config->Read(KEY_ANNOTATE_USE_SILENTMODE, &option, 0l);
|
||||
case 1:
|
||||
m_rbUseSheetNum->SetValue( 1 );
|
||||
break;
|
||||
|
||||
case 2:
|
||||
m_rbStartSheetNumLarge->SetValue( 1 );
|
||||
break;
|
||||
}
|
||||
|
||||
m_Config->Read( KEY_ANNOTATE_AUTOCLOSE_OPTION, &option, 0l );
|
||||
if( option )
|
||||
m_cbUseSilentMode->SetValue(1);
|
||||
m_cbAutoCloseDlg->SetValue( 1 );
|
||||
|
||||
m_Config->Read( KEY_ANNOTATE_USE_SILENTMODE, &option, 0l );
|
||||
if( option )
|
||||
m_cbUseSilentMode->SetValue( 1 );
|
||||
}
|
||||
|
||||
annotate_down_right_bitmap->SetBitmap( KiBitmap( annotate_down_right_xpm ) );
|
||||
|
@ -111,19 +168,17 @@ void DIALOG_ANNOTATE::InitValues()
|
|||
}
|
||||
|
||||
|
||||
/*********************************************************/
|
||||
void DIALOG_ANNOTATE::OnApplyClick( wxCommandEvent& event )
|
||||
/*********************************************************/
|
||||
{
|
||||
int response;
|
||||
wxString message;
|
||||
int response;
|
||||
wxString message;
|
||||
|
||||
if( m_Config )
|
||||
{
|
||||
m_Config->Write(KEY_ANNOTATE_SORT_OPTION, GetSortOrder());
|
||||
m_Config->Write(KEY_ANNOTATE_ALGO_OPTION, GetAnnotateAlgo());
|
||||
m_Config->Write(KEY_ANNOTATE_AUTOCLOSE_OPTION, GetAnnotateAutoCloseOpt());
|
||||
m_Config->Write(KEY_ANNOTATE_USE_SILENTMODE, GetAnnotateSilentMode());
|
||||
m_Config->Write( KEY_ANNOTATE_SORT_OPTION, GetSortOrder() );
|
||||
m_Config->Write( KEY_ANNOTATE_ALGO_OPTION, GetAnnotateAlgo() );
|
||||
m_Config->Write( KEY_ANNOTATE_AUTOCLOSE_OPTION, GetAnnotateAutoCloseOpt() );
|
||||
m_Config->Write( KEY_ANNOTATE_USE_SILENTMODE, GetAnnotateSilentMode() );
|
||||
}
|
||||
|
||||
// Display a message info in verbose mode,
|
||||
|
@ -152,7 +207,7 @@ void DIALOG_ANNOTATE::OnApplyClick( wxCommandEvent& event )
|
|||
{
|
||||
response = wxMessageBox( message, wxT( "" ), wxICON_EXCLAMATION | wxOK | wxCANCEL );
|
||||
|
||||
if (response == wxCANCEL)
|
||||
if( response == wxCANCEL )
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -176,13 +231,11 @@ void DIALOG_ANNOTATE::OnApplyClick( wxCommandEvent& event )
|
|||
}
|
||||
|
||||
|
||||
/************************************************************************/
|
||||
void DIALOG_ANNOTATE::OnClearAnnotationCmpClick( wxCommandEvent& event )
|
||||
/************************************************************************/
|
||||
{
|
||||
int response;
|
||||
int response;
|
||||
wxString message;
|
||||
|
||||
wxString message;
|
||||
if( GetLevel() )
|
||||
message = _( "Clear the existing annotation for the entire schematic?" );
|
||||
else
|
||||
|
@ -191,19 +244,17 @@ void DIALOG_ANNOTATE::OnClearAnnotationCmpClick( wxCommandEvent& event )
|
|||
message += _( "\n\nThis operation will clear the existing annotation and cannot be undone." );
|
||||
response = wxMessageBox( message, wxT( "" ), wxICON_EXCLAMATION | wxOK | wxCANCEL );
|
||||
|
||||
if (response == wxCANCEL)
|
||||
if( response == wxCANCEL )
|
||||
return;
|
||||
|
||||
m_Parent->DeleteAnnotation( GetLevel() ? false : true );
|
||||
m_Parent->GetCanvas()->Refresh();
|
||||
|
||||
m_btnClear->Enable(false);
|
||||
m_btnClear->Enable( false );
|
||||
}
|
||||
|
||||
|
||||
/************************************************************/
|
||||
void DIALOG_ANNOTATE::OnCancelClick( wxCommandEvent& event )
|
||||
/************************************************************/
|
||||
{
|
||||
if( IsModal() )
|
||||
EndModal( wxID_CANCEL );
|
||||
|
@ -215,44 +266,46 @@ void DIALOG_ANNOTATE::OnCancelClick( wxCommandEvent& event )
|
|||
}
|
||||
|
||||
|
||||
/**************************************/
|
||||
bool DIALOG_ANNOTATE::GetLevel( void )
|
||||
/**************************************/
|
||||
bool DIALOG_ANNOTATE::GetLevel()
|
||||
{
|
||||
return m_rbEntireSchematic->GetValue();
|
||||
}
|
||||
|
||||
/******************************************/
|
||||
bool DIALOG_ANNOTATE::GetResetItems( void )
|
||||
/******************************************/
|
||||
|
||||
bool DIALOG_ANNOTATE::GetResetItems()
|
||||
{
|
||||
return m_rbResetAnnotation->GetValue();
|
||||
}
|
||||
|
||||
int DIALOG_ANNOTATE::GetSortOrder( void )
|
||||
/**
|
||||
* @return 0 if annotation by X position,
|
||||
* 1 if annotation by Y position,
|
||||
* 2 if annotation by value
|
||||
*/
|
||||
|
||||
int DIALOG_ANNOTATE::GetSortOrder()
|
||||
{
|
||||
if ( m_rbSortBy_X_Position->GetValue() )
|
||||
if( m_rbSortBy_X_Position->GetValue() )
|
||||
return 0;
|
||||
if ( m_rbSortBy_Y_Position->GetValue() )
|
||||
|
||||
if( m_rbSortBy_Y_Position->GetValue() )
|
||||
return 1;
|
||||
|
||||
return 2;
|
||||
}
|
||||
|
||||
int DIALOG_ANNOTATE::GetAnnotateAlgo( void )
|
||||
/**
|
||||
* @return 0 if annotation using first not used Id value
|
||||
* 1 if annotation using first not used Id value inside sheet num * 100 to sheet num * 100 + 99
|
||||
* 2 if annotation using first nhot used Id value inside sheet num * 1000 to sheet num * 1000 + 999
|
||||
*/
|
||||
|
||||
int DIALOG_ANNOTATE::GetAnnotateAlgo()
|
||||
{
|
||||
if ( m_rbUseIncremental->GetValue() )
|
||||
if( m_rbUseIncremental->GetValue() )
|
||||
return 0;
|
||||
if ( m_rbUseSheetNum->GetValue() )
|
||||
|
||||
if( m_rbUseSheetNum->GetValue() )
|
||||
return 1;
|
||||
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
||||
int InvokeDialogAnnotate( SCH_EDIT_FRAME* aCaller )
|
||||
{
|
||||
DIALOG_ANNOTATE dlg( aCaller );
|
||||
|
||||
return dlg.ShowModal();
|
||||
}
|
||||
|
|
@ -0,0 +1,489 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2013 Jean-Pierre Charras, jp.charras@wanadoo.fr
|
||||
* 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
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file eeschema/dialogs/dialog_bom.cpp
|
||||
* @brief Dialog box for creating bom and other documents from generic netlist.
|
||||
*/
|
||||
|
||||
|
||||
#include <fctsys.h>
|
||||
#include <appl_wxstruct.h>
|
||||
#include <confirm.h>
|
||||
#include <gestfich.h>
|
||||
#include <wxEeschemaStruct.h>
|
||||
|
||||
#include <netlist.h>
|
||||
#include <sch_sheet.h>
|
||||
#include <invoke_sch_dialog.h>
|
||||
#include <dialog_helpers.h>
|
||||
#include <dialog_bom_base.h>
|
||||
#include <html_messagebox.h>
|
||||
|
||||
#define BOM_PLUGINS_KEY wxT("bom_plugins")
|
||||
#define BOM_PLUGIN_SELECTED_KEY wxT("bom_plugin_selected")
|
||||
|
||||
const char * s_bomHelpInfo =
|
||||
#include <dialog_bom_help_html.h>
|
||||
;
|
||||
|
||||
#include <dialog_bom_cfg_lexer.h>
|
||||
|
||||
using namespace T_BOMCFG_T;
|
||||
|
||||
/**
|
||||
* Class BOM_CFG_READER_PARSER
|
||||
* holds data and functions pertinent to parsing a S-expression file
|
||||
* for a WORKSHEET_LAYOUT.
|
||||
*/
|
||||
class BOM_CFG_READER_PARSER : public DIALOG_BOM_CFG_LEXER
|
||||
{
|
||||
wxArrayString* m_pluginsList;
|
||||
|
||||
public:
|
||||
BOM_CFG_READER_PARSER( wxArrayString* aPlugins,
|
||||
const char* aData, const wxString& aSource );
|
||||
void Parse() throw( PARSE_ERROR, IO_ERROR );
|
||||
|
||||
private:
|
||||
void parsePlugin() throw( IO_ERROR, PARSE_ERROR );
|
||||
|
||||
};
|
||||
|
||||
// PCB_PLOT_PARAMS_PARSER
|
||||
|
||||
BOM_CFG_READER_PARSER::BOM_CFG_READER_PARSER( wxArrayString* aPlugins,
|
||||
const char* aLine,
|
||||
const wxString& aSource ) :
|
||||
DIALOG_BOM_CFG_LEXER( aLine, aSource )
|
||||
{
|
||||
m_pluginsList = aPlugins;
|
||||
}
|
||||
|
||||
|
||||
void BOM_CFG_READER_PARSER::Parse() throw( PARSE_ERROR, IO_ERROR )
|
||||
{
|
||||
T token;
|
||||
|
||||
while( ( token = NextTok() ) != T_RIGHT )
|
||||
{
|
||||
if( token == T_EOF)
|
||||
break;
|
||||
|
||||
if( token == T_LEFT )
|
||||
token = NextTok();
|
||||
|
||||
if( token == T_plugins )
|
||||
continue;
|
||||
|
||||
switch( token )
|
||||
{
|
||||
case T_plugin: // Defines a new plugin
|
||||
parsePlugin();
|
||||
break;
|
||||
|
||||
default:
|
||||
// Unexpected( CurText() );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void BOM_CFG_READER_PARSER::parsePlugin() throw( IO_ERROR, PARSE_ERROR )
|
||||
{
|
||||
wxString title, command;
|
||||
|
||||
NeedSYMBOLorNUMBER();
|
||||
title = FromUTF8();
|
||||
|
||||
T token;
|
||||
while( ( token = NextTok() ) != T_RIGHT )
|
||||
{
|
||||
if( token == T_EOF)
|
||||
break;
|
||||
|
||||
switch( token )
|
||||
{
|
||||
case T_LEFT:
|
||||
break;
|
||||
|
||||
case T_cmd:
|
||||
NeedSYMBOLorNUMBER();
|
||||
command = FromUTF8();
|
||||
NeedRIGHT();
|
||||
break;
|
||||
|
||||
case T_opts:
|
||||
while( ( token = NextTok() ) != T_RIGHT && token != T_EOF );
|
||||
break;
|
||||
|
||||
default:
|
||||
Unexpected( CurText() );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if( ! title.IsEmpty() )
|
||||
{
|
||||
m_pluginsList->Add( title );
|
||||
m_pluginsList->Add( command );
|
||||
}
|
||||
}
|
||||
|
||||
// The main dialog frame tu run scripts to build bom
|
||||
class DIALOG_BOM : public DIALOG_BOM_BASE
|
||||
{
|
||||
private:
|
||||
SCH_EDIT_FRAME* m_parent;
|
||||
// The list of scripts (or plugins):
|
||||
// a script descr uses 2 lines:
|
||||
// the first is the title
|
||||
// the second is the command line
|
||||
wxArrayString m_plugins;
|
||||
wxConfig* m_config; // to store the "plugins"
|
||||
|
||||
public:
|
||||
// Constructor and destructor
|
||||
DIALOG_BOM( SCH_EDIT_FRAME* parent );
|
||||
~DIALOG_BOM();
|
||||
|
||||
private:
|
||||
void OnPluginSelected( wxCommandEvent& event );
|
||||
void OnRunPlugin( wxCommandEvent& event );
|
||||
void OnCancelClick( wxCommandEvent& event );
|
||||
void OnHelp( wxCommandEvent& event );
|
||||
void OnAddPlugin( wxCommandEvent& event );
|
||||
void OnChoosePlugin( wxCommandEvent& event );
|
||||
void OnRemovePlugin( wxCommandEvent& event );
|
||||
void OnEditPlugin( wxCommandEvent& event );
|
||||
void OnCommandLineEdited( wxCommandEvent& event );
|
||||
void OnNameEdited( wxCommandEvent& event );
|
||||
|
||||
void pluginInit();
|
||||
void installPluginsList();
|
||||
};
|
||||
|
||||
// Create and show DIALOG_BOM.
|
||||
int InvokeDialogCreateBOM( SCH_EDIT_FRAME* aCaller )
|
||||
{
|
||||
DIALOG_BOM dlg( aCaller );
|
||||
return dlg.ShowModal();
|
||||
}
|
||||
|
||||
DIALOG_BOM::DIALOG_BOM( SCH_EDIT_FRAME* parent ) :
|
||||
DIALOG_BOM_BASE( parent )
|
||||
{
|
||||
m_parent = parent;
|
||||
m_config = wxGetApp().GetSettings();
|
||||
installPluginsList();
|
||||
|
||||
GetSizer()->SetSizeHints( this );
|
||||
Centre();
|
||||
}
|
||||
|
||||
DIALOG_BOM::~DIALOG_BOM()
|
||||
{
|
||||
// Save the plugin descriptions in config.
|
||||
// the config stores only one string.
|
||||
// plugins are saved inside a S expr:
|
||||
// ( plugins
|
||||
// ( plugin "plugin name" (cmd "command line") )
|
||||
// ....
|
||||
// )
|
||||
|
||||
STRING_FORMATTER writer;
|
||||
writer.Print( 0, "(plugins" );
|
||||
for( unsigned ii = 0; ii < m_plugins.GetCount(); ii += 2 )
|
||||
{
|
||||
writer.Print( 1, "(plugin %s (cmd %s))",
|
||||
writer.Quotew( m_plugins[ii] ).c_str(),
|
||||
writer.Quotew( m_plugins[ii+1] ).c_str() );
|
||||
}
|
||||
writer.Print( 0, ")" );
|
||||
|
||||
wxString list( FROM_UTF8( writer.GetString().c_str() ) );
|
||||
|
||||
m_config->Write( BOM_PLUGINS_KEY, list );
|
||||
|
||||
wxString active_plugin_name = m_lbPlugins->GetStringSelection( );
|
||||
m_config->Write( BOM_PLUGIN_SELECTED_KEY, active_plugin_name );
|
||||
|
||||
}
|
||||
|
||||
/* Read the initialized plugins in config and fill the list
|
||||
* of names
|
||||
*/
|
||||
void DIALOG_BOM::installPluginsList()
|
||||
{
|
||||
wxString list, active_plugin_name;
|
||||
m_config->Read( BOM_PLUGINS_KEY, &list );
|
||||
m_config->Read( BOM_PLUGIN_SELECTED_KEY, &active_plugin_name );
|
||||
|
||||
if( !list.IsEmpty() )
|
||||
{
|
||||
BOM_CFG_READER_PARSER cfg_parser( &m_plugins, TO_UTF8( list ),
|
||||
wxT( "plugins" ) );
|
||||
try
|
||||
{
|
||||
cfg_parser.Parse();
|
||||
}
|
||||
catch( IO_ERROR ioe )
|
||||
{
|
||||
// wxLogMessage( ioe.errorText );
|
||||
}
|
||||
}
|
||||
|
||||
// Populate list box
|
||||
for( unsigned ii = 0; ii < m_plugins.GetCount(); ii+=2 )
|
||||
{
|
||||
m_lbPlugins->Append( m_plugins[ii] );
|
||||
|
||||
if( active_plugin_name == m_plugins[ii] )
|
||||
m_lbPlugins->SetSelection( ii/2 );
|
||||
}
|
||||
|
||||
pluginInit();
|
||||
}
|
||||
|
||||
void DIALOG_BOM::OnPluginSelected( wxCommandEvent& event )
|
||||
{
|
||||
pluginInit();
|
||||
}
|
||||
|
||||
void DIALOG_BOM::pluginInit()
|
||||
{
|
||||
int ii = m_lbPlugins->GetSelection();
|
||||
|
||||
if( ii < 0 )
|
||||
{
|
||||
m_textCtrlName->SetValue( wxEmptyString );
|
||||
m_textCtrlCommand->SetValue( wxEmptyString );
|
||||
return;
|
||||
}
|
||||
|
||||
m_textCtrlName->SetValue( m_plugins[2 * ii] );
|
||||
m_textCtrlCommand->SetValue( m_plugins[(2 * ii)+1] );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Function RunPlugin
|
||||
* run the plugin command line
|
||||
*/
|
||||
void DIALOG_BOM::OnRunPlugin( wxCommandEvent& event )
|
||||
{
|
||||
wxFileName fn;
|
||||
wxString fileWildcard;
|
||||
wxString title = _( "Save Netlist File" );
|
||||
|
||||
// Calculate the xml netlist filename
|
||||
fn = g_RootSheet->GetScreen()->GetFileName();
|
||||
|
||||
if( fn.GetPath().IsEmpty() )
|
||||
fn.SetPath( wxGetCwd() );
|
||||
|
||||
fn.ClearExt();
|
||||
wxString fullfilename = fn.GetFullPath();
|
||||
m_parent->ClearMsgPanel();
|
||||
|
||||
m_parent->SetNetListerCommand( m_textCtrlCommand->GetValue() );
|
||||
m_parent->CreateNetlist( -1, fullfilename, 0 );
|
||||
}
|
||||
|
||||
|
||||
void DIALOG_BOM::OnCancelClick( wxCommandEvent& event )
|
||||
{
|
||||
EndModal( wxID_CANCEL );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Function OnRemovePlugin
|
||||
* Remove a plugin from the list
|
||||
*/
|
||||
void DIALOG_BOM::OnRemovePlugin( wxCommandEvent& event )
|
||||
{
|
||||
int ii = m_lbPlugins->GetSelection();
|
||||
|
||||
if( ii < 0 )
|
||||
return;
|
||||
|
||||
m_lbPlugins->Delete( ii );
|
||||
|
||||
m_plugins.RemoveAt( 2*ii, 2 ); // Remove title and command line
|
||||
|
||||
// Select the next item, if exists
|
||||
if( (int)m_lbPlugins->GetCount() >= ii )
|
||||
ii = m_lbPlugins->GetCount() - 1;
|
||||
|
||||
if( ii >= 0 )
|
||||
m_lbPlugins->SetSelection( ii );
|
||||
|
||||
pluginInit();
|
||||
}
|
||||
|
||||
/**
|
||||
* Function OnAddPlugin
|
||||
* Add a new panel for a new netlist plugin
|
||||
*/
|
||||
void DIALOG_BOM::OnAddPlugin( wxCommandEvent& event )
|
||||
{
|
||||
// Creates a new plugin entry
|
||||
wxString name = wxGetTextFromUser( _("Plugin") );
|
||||
|
||||
if( name.IsEmpty() )
|
||||
return;
|
||||
|
||||
// Verify if it does not exists
|
||||
for( unsigned ii = 0; ii < m_plugins.GetCount(); ii += 2 )
|
||||
{
|
||||
if( name == m_plugins[ii] )
|
||||
{
|
||||
wxMessageBox( _("This plugin already exists. Abort") );
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
m_plugins.Add( name );
|
||||
m_plugins.Add( wxEmptyString );
|
||||
m_lbPlugins->Append( name );
|
||||
m_lbPlugins->SetSelection( m_lbPlugins->GetCount() - 1 );
|
||||
pluginInit();
|
||||
}
|
||||
|
||||
/*
|
||||
* Browse plugin files, and set m_CommandStringCtrl field
|
||||
*/
|
||||
void DIALOG_BOM::OnChoosePlugin( wxCommandEvent& event )
|
||||
{
|
||||
wxString FullFileName, Mask, Path;
|
||||
|
||||
Mask = wxT( "*" );
|
||||
Path = wxGetApp().GetExecutablePath();
|
||||
FullFileName = EDA_FileSelector( _( "Plugin files:" ),
|
||||
Path,
|
||||
FullFileName,
|
||||
wxEmptyString,
|
||||
Mask,
|
||||
this,
|
||||
wxFD_OPEN,
|
||||
true
|
||||
);
|
||||
if( FullFileName.IsEmpty() )
|
||||
return;
|
||||
|
||||
// Creates a default command line,
|
||||
// suitable to run the external tool xslproc or python
|
||||
// The default command line depending on plugin extension, currently
|
||||
// "xsl" or "exe" or "py"
|
||||
wxString cmdLine;
|
||||
wxFileName fn( FullFileName );
|
||||
wxString ext = fn.GetExt();
|
||||
|
||||
if( ext == wxT("xsl" ) )
|
||||
cmdLine.Printf(wxT("xsltproc -o \"%%O\" \"%s\" \"%%I\""), GetChars(FullFileName) );
|
||||
else if( ext == wxT("exe" ) || ext.IsEmpty() )
|
||||
cmdLine.Printf(wxT("\"%s\" < \"%%I\" > \"%%O\""), GetChars(FullFileName) );
|
||||
else if( ext == wxT("py" ) || ext.IsEmpty() )
|
||||
cmdLine.Printf(wxT("python \"%s\" \"%%I\" \"%%O\""), GetChars(FullFileName) );
|
||||
else
|
||||
cmdLine.Printf(wxT("\"%s\""), GetChars(FullFileName) );
|
||||
|
||||
m_textCtrlCommand->SetValue( cmdLine );
|
||||
}
|
||||
|
||||
void DIALOG_BOM::OnEditPlugin( wxCommandEvent& event )
|
||||
{
|
||||
wxString pluginName, cmdline;
|
||||
|
||||
// Try to find the plugin name.
|
||||
// This is possible if the name ends by .py or .xsl
|
||||
cmdline = m_textCtrlCommand->GetValue();
|
||||
int pos = -1;
|
||||
|
||||
if( (pos = cmdline.Find( wxT(".py") )) != wxNOT_FOUND )
|
||||
pos += 2;
|
||||
else if( (pos = cmdline.Find( wxT(".xsl") )) != wxNOT_FOUND )
|
||||
pos += 3;
|
||||
|
||||
// the end of plugin name is at position pos.
|
||||
if( pos > 0 )
|
||||
{
|
||||
// Be sure this is the end of the name: the next char is " or space
|
||||
int eos = cmdline[pos+1];
|
||||
|
||||
if( eos == ' '|| eos == '\"' )
|
||||
{
|
||||
// search for the starting point of the name
|
||||
int jj = pos-1;
|
||||
while( jj >= 0 )
|
||||
if( cmdline[jj] != eos )
|
||||
jj--;
|
||||
else
|
||||
break;
|
||||
|
||||
// extract the name
|
||||
if( jj >= 0 )
|
||||
pluginName = cmdline.SubString( jj, pos );
|
||||
}
|
||||
}
|
||||
AddDelimiterString( pluginName );
|
||||
wxString editorname = wxGetApp().GetEditorName();
|
||||
|
||||
if( !editorname.IsEmpty() )
|
||||
ExecuteFile( this, editorname, pluginName );
|
||||
else
|
||||
wxMessageBox( _("No text editor selected in KiCad. Please choose it") );
|
||||
}
|
||||
|
||||
void DIALOG_BOM::OnHelp( wxCommandEvent& event )
|
||||
{
|
||||
HTML_MESSAGE_BOX help_Dlg( this, _("Bom Generation Help"),
|
||||
wxDefaultPosition, wxSize( 750,550 ) );
|
||||
|
||||
wxString msg = FROM_UTF8(s_bomHelpInfo);
|
||||
help_Dlg.m_htmlWindow->AppendToPage( msg );
|
||||
help_Dlg.ShowModal();
|
||||
}
|
||||
|
||||
void DIALOG_BOM::OnCommandLineEdited( wxCommandEvent& event )
|
||||
{
|
||||
int ii = m_lbPlugins->GetSelection();
|
||||
|
||||
if( ii < 0 )
|
||||
return;
|
||||
|
||||
m_plugins[(2 * ii)+1] = m_textCtrlCommand->GetValue();
|
||||
}
|
||||
|
||||
void DIALOG_BOM::OnNameEdited( wxCommandEvent& event )
|
||||
{
|
||||
int ii = m_lbPlugins->GetSelection();
|
||||
|
||||
if( ii < 0 )
|
||||
return;
|
||||
|
||||
m_plugins[2 * ii] = m_textCtrlName->GetValue();
|
||||
m_lbPlugins->SetString( ii, m_plugins[2 * ii] );
|
||||
}
|
|
@ -0,0 +1,115 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Oct 8 2012)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "dialog_bom_base.h"
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
BEGIN_EVENT_TABLE( DIALOG_BOM_BASE, DIALOG_SHIM )
|
||||
EVT_LISTBOX( wxID_ANY, DIALOG_BOM_BASE::_wxFB_OnPluginSelected )
|
||||
EVT_TEXT( IN_NAMELINE, DIALOG_BOM_BASE::_wxFB_OnNameEdited )
|
||||
EVT_BUTTON( ID_CREATE_BOM, DIALOG_BOM_BASE::_wxFB_OnRunPlugin )
|
||||
EVT_BUTTON( wxID_CANCEL, DIALOG_BOM_BASE::_wxFB_OnCancelClick )
|
||||
EVT_BUTTON( ID_HELP, DIALOG_BOM_BASE::_wxFB_OnHelp )
|
||||
EVT_BUTTON( ID_ADD_PLUGIN, DIALOG_BOM_BASE::_wxFB_OnAddPlugin )
|
||||
EVT_BUTTON( wxID_BROWSE_PLUGINS, DIALOG_BOM_BASE::_wxFB_OnChoosePlugin )
|
||||
EVT_BUTTON( ID_REMOVEL_PLUGIN, DIALOG_BOM_BASE::_wxFB_OnRemovePlugin )
|
||||
EVT_BUTTON( wxID_ANY, DIALOG_BOM_BASE::_wxFB_OnEditPlugin )
|
||||
EVT_TEXT( ID_CMDLINE, DIALOG_BOM_BASE::_wxFB_OnCommandLineEdited )
|
||||
END_EVENT_TABLE()
|
||||
|
||||
DIALOG_BOM_BASE::DIALOG_BOM_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style )
|
||||
{
|
||||
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
|
||||
|
||||
wxBoxSizer* bMainSizer;
|
||||
bMainSizer = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
wxBoxSizer* bUpperSizer;
|
||||
bUpperSizer = new wxBoxSizer( wxHORIZONTAL );
|
||||
|
||||
wxBoxSizer* bLeftSizer;
|
||||
bLeftSizer = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
m_staticTextPluginTitle = new wxStaticText( this, wxID_ANY, _("Plugins"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticTextPluginTitle->Wrap( -1 );
|
||||
bLeftSizer->Add( m_staticTextPluginTitle, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_lbPlugins = new wxListBox( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
|
||||
bLeftSizer->Add( m_lbPlugins, 1, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_staticTextName = new wxStaticText( this, wxID_ANY, _("Name:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticTextName->Wrap( -1 );
|
||||
bLeftSizer->Add( m_staticTextName, 0, wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_textCtrlName = new wxTextCtrl( this, IN_NAMELINE, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_textCtrlName->SetMaxLength( 0 );
|
||||
bLeftSizer->Add( m_textCtrlName, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
|
||||
bUpperSizer->Add( bLeftSizer, 1, wxEXPAND, 5 );
|
||||
|
||||
wxBoxSizer* bRightSizer;
|
||||
bRightSizer = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
m_buttonNetlist = new wxButton( this, ID_CREATE_BOM, _("Generate"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_buttonNetlist->SetDefault();
|
||||
bRightSizer->Add( m_buttonNetlist, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Close"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
bRightSizer->Add( m_buttonCancel, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_buttonHelp = new wxButton( this, ID_HELP, _("Help"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
bRightSizer->Add( m_buttonHelp, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
m_staticline2 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
||||
bRightSizer->Add( m_staticline2, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_buttonAddPlugin = new wxButton( this, ID_ADD_PLUGIN, _("Add Plugin"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
bRightSizer->Add( m_buttonAddPlugin, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_buttonBrowsePlugin = new wxButton( this, wxID_BROWSE_PLUGINS, _("Set Plugin Cmd"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
bRightSizer->Add( m_buttonBrowsePlugin, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_buttonDelPlugin = new wxButton( this, ID_REMOVEL_PLUGIN, _("Remove Plugin"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
bRightSizer->Add( m_buttonDelPlugin, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_buttonEdit = new wxButton( this, wxID_ANY, _("Edit Plugin File"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
bRightSizer->Add( m_buttonEdit, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
bUpperSizer->Add( bRightSizer, 0, wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
|
||||
bMainSizer->Add( bUpperSizer, 1, wxEXPAND, 5 );
|
||||
|
||||
wxBoxSizer* bbottomSizer;
|
||||
bbottomSizer = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
m_staticTextCmd = new wxStaticText( this, wxID_ANY, _("Command line:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticTextCmd->Wrap( -1 );
|
||||
bbottomSizer->Add( m_staticTextCmd, 0, wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_textCtrlCommand = new wxTextCtrl( this, ID_CMDLINE, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_textCtrlCommand->SetMaxLength( 0 );
|
||||
m_textCtrlCommand->SetMinSize( wxSize( 380,-1 ) );
|
||||
|
||||
bbottomSizer->Add( m_textCtrlCommand, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
|
||||
bMainSizer->Add( bbottomSizer, 0, wxEXPAND, 5 );
|
||||
|
||||
|
||||
this->SetSizer( bMainSizer );
|
||||
this->Layout();
|
||||
|
||||
this->Centre( wxBOTH );
|
||||
}
|
||||
|
||||
DIALOG_BOM_BASE::~DIALOG_BOM_BASE()
|
||||
{
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,100 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Oct 8 2012)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __DIALOG_BOM_BASE_H__
|
||||
#define __DIALOG_BOM_BASE_H__
|
||||
|
||||
#include <wx/artprov.h>
|
||||
#include <wx/xrc/xmlres.h>
|
||||
#include <wx/intl.h>
|
||||
class DIALOG_SHIM;
|
||||
|
||||
#include "dialog_shim.h"
|
||||
#include <wx/string.h>
|
||||
#include <wx/stattext.h>
|
||||
#include <wx/gdicmn.h>
|
||||
#include <wx/font.h>
|
||||
#include <wx/colour.h>
|
||||
#include <wx/settings.h>
|
||||
#include <wx/listbox.h>
|
||||
#include <wx/textctrl.h>
|
||||
#include <wx/sizer.h>
|
||||
#include <wx/button.h>
|
||||
#include <wx/statline.h>
|
||||
#include <wx/dialog.h>
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
/// Class DIALOG_BOM_BASE
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
class DIALOG_BOM_BASE : public DIALOG_SHIM
|
||||
{
|
||||
DECLARE_EVENT_TABLE()
|
||||
private:
|
||||
|
||||
// Private event handlers
|
||||
void _wxFB_OnPluginSelected( wxCommandEvent& event ){ OnPluginSelected( event ); }
|
||||
void _wxFB_OnNameEdited( wxCommandEvent& event ){ OnNameEdited( event ); }
|
||||
void _wxFB_OnRunPlugin( wxCommandEvent& event ){ OnRunPlugin( event ); }
|
||||
void _wxFB_OnCancelClick( wxCommandEvent& event ){ OnCancelClick( event ); }
|
||||
void _wxFB_OnHelp( wxCommandEvent& event ){ OnHelp( event ); }
|
||||
void _wxFB_OnAddPlugin( wxCommandEvent& event ){ OnAddPlugin( event ); }
|
||||
void _wxFB_OnChoosePlugin( wxCommandEvent& event ){ OnChoosePlugin( event ); }
|
||||
void _wxFB_OnRemovePlugin( wxCommandEvent& event ){ OnRemovePlugin( event ); }
|
||||
void _wxFB_OnEditPlugin( wxCommandEvent& event ){ OnEditPlugin( event ); }
|
||||
void _wxFB_OnCommandLineEdited( wxCommandEvent& event ){ OnCommandLineEdited( event ); }
|
||||
|
||||
|
||||
protected:
|
||||
enum
|
||||
{
|
||||
IN_NAMELINE = 1000,
|
||||
ID_CREATE_BOM,
|
||||
ID_HELP,
|
||||
ID_ADD_PLUGIN,
|
||||
wxID_BROWSE_PLUGINS,
|
||||
ID_REMOVEL_PLUGIN,
|
||||
ID_CMDLINE
|
||||
};
|
||||
|
||||
wxStaticText* m_staticTextPluginTitle;
|
||||
wxListBox* m_lbPlugins;
|
||||
wxStaticText* m_staticTextName;
|
||||
wxTextCtrl* m_textCtrlName;
|
||||
wxButton* m_buttonNetlist;
|
||||
wxButton* m_buttonCancel;
|
||||
wxButton* m_buttonHelp;
|
||||
wxStaticLine* m_staticline2;
|
||||
wxButton* m_buttonAddPlugin;
|
||||
wxButton* m_buttonBrowsePlugin;
|
||||
wxButton* m_buttonDelPlugin;
|
||||
wxButton* m_buttonEdit;
|
||||
wxStaticText* m_staticTextCmd;
|
||||
wxTextCtrl* m_textCtrlCommand;
|
||||
|
||||
// Virtual event handlers, overide them in your derived class
|
||||
virtual void OnPluginSelected( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnNameEdited( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnRunPlugin( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnCancelClick( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnHelp( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnAddPlugin( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnChoosePlugin( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnRemovePlugin( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnEditPlugin( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnCommandLineEdited( wxCommandEvent& event ) { event.Skip(); }
|
||||
|
||||
|
||||
public:
|
||||
|
||||
DIALOG_BOM_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Bill of Material"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 404,315 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
|
||||
~DIALOG_BOM_BASE();
|
||||
|
||||
};
|
||||
|
||||
#endif //__DIALOG_BOM_BASE_H__
|
|
@ -0,0 +1,4 @@
|
|||
plugins
|
||||
plugin
|
||||
cmd
|
||||
opts
|
|
@ -0,0 +1,210 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
|
||||
<TITLE>kicad help</TITLE>
|
||||
<META NAME="GENERATOR" CONTENT="LibreOffice 4.0.2.2 (Windows)">
|
||||
<META NAME="CREATED" CONTENT="0;0">
|
||||
<META NAME="CHANGED" CONTENT="20130614;10225357">
|
||||
<STYLE TYPE="text/css">
|
||||
<!--
|
||||
@page { margin: 2cm }
|
||||
P { margin-bottom: 0.21cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto }
|
||||
P.western { font-family: "Arial", sans-serif; font-size: 10pt; so-language: en-US }
|
||||
A:link { color: #004586; text-decoration: none }
|
||||
A.western:link { font-family: "Liberation Sans", sans-serif; so-language: zxx; font-style: italic }
|
||||
A.sdfootnotesym-western { font-family: "DejaVu Serif", serif }
|
||||
-->
|
||||
</STYLE>
|
||||
</HEAD>
|
||||
<BODY LANG="en-AU" LINK="#004586" DIR="LTR">
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto"><A NAME="__RefHeading__2925_482973253"></A>
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3><B>1 - Full
|
||||
documentation:</B></FONT></FONT></P>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3><SPAN LANG="en-US"><B>The
|
||||
</B></SPAN></FONT></FONT><FONT FACE="Times New Roman, serif"><FONT SIZE=3><SPAN LANG="en-US"><I><B>Eeschema
|
||||
documentation, chapter 14</B></I></SPAN></FONT></FONT><FONT FACE="Times New Roman, serif"><FONT SIZE=3><SPAN LANG="en-US"><B>
|
||||
describes this intermediate netlist and gives examples<BR>See also
|
||||
</B></SPAN></FONT></FONT><FONT FACE="Times New Roman, serif"><FONT SIZE=3><SPAN LANG="en-US"><I><B>https://answers.launchpad.net/kicad/+faq/2265</B></I></SPAN></FONT></FONT></P>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3><B><I>2 - </I>The
|
||||
intermediate Netlist File</B></FONT></FONT></P>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3>BOM files (and
|
||||
netlist files) can be created from an Intermediate netlist file
|
||||
created by Eeschema.</FONT></FONT></P>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3>This file uses XML
|
||||
syntax and is called the intermediate netlist. The intermediate
|
||||
netlist includes a large amount of data about your board and because
|
||||
of this, it can be used with post-processing to create a BOM or other
|
||||
reports.</FONT></FONT></P>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3>Depending on the
|
||||
output (BOM or netlist), different subsets of the complete
|
||||
Intermediate Netlist file will be used in the post-processing.</FONT></FONT></P>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3><B>3 - Conversion to
|
||||
a new format</B></FONT></FONT></P>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3>By applying a
|
||||
post-processing filter to the Intermediate netlist file you can
|
||||
generate foreign netlist files as well as BOM files. Because this
|
||||
conversion is a text to text transformation.</FONT></FONT></P>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3>this post-processing
|
||||
filter can be written using Python, XSLT, or any other tool capable
|
||||
of taking XML as input.</FONT></FONT></P>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3><SPAN STYLE="font-variant: normal"><SPAN STYLE="font-style: normal"><SPAN STYLE="font-weight: normal">XSLT
|
||||
itself is a XML language very suitable for XML transformations. There
|
||||
is a free program called </SPAN></SPAN></SPAN><I><SPAN STYLE="font-weight: normal">xsltproc</SPAN></I><SPAN STYLE="font-variant: normal">
|
||||
</SPAN><SPAN STYLE="font-variant: normal"><SPAN STYLE="font-style: normal"><SPAN STYLE="font-weight: normal">that
|
||||
you can download and install. The</SPAN></SPAN></SPAN><SPAN STYLE="font-variant: normal">
|
||||
</SPAN><SPAN STYLE="font-variant: normal"><SPAN STYLE="font-style: normal"><SPAN STYLE="font-weight: normal">xsltproc
|
||||
program can be used to read the Intermediate XML netlist input file,
|
||||
apply</SPAN></SPAN></SPAN><SPAN STYLE="font-variant: normal"> </SPAN><SPAN STYLE="font-variant: normal"><SPAN STYLE="font-style: normal"><SPAN STYLE="font-weight: normal">a
|
||||
style-sheet to transform the input, and save the results in an output
|
||||
file. Use of xsltproc requires a style-sheet file using XSLT
|
||||
conventions. The full conversion process is handled</SPAN></SPAN></SPAN><SPAN STYLE="font-variant: normal">
|
||||
</SPAN><SPAN STYLE="font-variant: normal"><SPAN STYLE="font-style: normal"><SPAN STYLE="font-weight: normal">by
|
||||
Eeschema, after it is configured once to run xsltproc in a specific
|
||||
way.</SPAN></SPAN></SPAN></FONT></FONT></P>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3><B>4 -
|
||||
Initialization of the dialog window</B></FONT></FONT></P>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3>You should add a new
|
||||
pluging (a script) in plugin list by clicking on the Add Plugin
|
||||
button.</FONT></FONT></P>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3><B>4.1 - Plugin
|
||||
Configuration Parameters</B></FONT></FONT></P>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3>The Eeschema plug-in
|
||||
configuration dialog requires the following information:</FONT></FONT></P>
|
||||
<UL>
|
||||
<LI><P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3>The title: for
|
||||
instance, the name of the netlist format.</FONT></FONT></P>
|
||||
<LI><P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3>The command line to
|
||||
launch the converter (usually a script).</FONT></FONT></P>
|
||||
</UL>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3>Once you click on
|
||||
the generate button the following will happen:</FONT></FONT></P>
|
||||
<OL>
|
||||
<LI><P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3>Eeschema creates an
|
||||
intermediate netlist file *.xml, for instance <I>test.xml.</I></FONT></FONT></P>
|
||||
<LI><P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3>Eeschema runs the
|
||||
script from the command line to create the final output file.</FONT></FONT></P>
|
||||
</OL>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3><B>4.2 - Generate
|
||||
netlist files with the command line</B></FONT></FONT></P>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3>Assuming we are
|
||||
using the program <I>xsltproc.exe</I><SPAN STYLE="font-variant: normal">
|
||||
</SPAN><SPAN STYLE="font-variant: normal"><SPAN STYLE="font-style: normal">to
|
||||
apply the sheet style to the intermediate file, </SPAN></SPAN><I>xsltproc.exe</I><SPAN STYLE="font-variant: normal">
|
||||
</SPAN><SPAN STYLE="font-variant: normal"><SPAN STYLE="font-style: normal">is
|
||||
executed with the following command.</SPAN></SPAN></FONT></FONT></P>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3>xsltproc.exe -o <
|
||||
output filename > < style-sheet filename > < input XML
|
||||
file to convert ></FONT></FONT></P>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3><FONT SIZE=2 STYLE="font-size: 11pt">On</FONT>
|
||||
<FONT SIZE=2 STYLE="font-size: 11pt">Windows the command line is the
|
||||
following.<BR></FONT><FONT SIZE=2 STYLE="font-size: 11pt"><I>f:/kicad/bin/xsltproc.exe
|
||||
-o “%O” f:/kicad/bin/plugins/myconverter.xsl “%I”</I></FONT></FONT></FONT></P>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3><FONT SIZE=2 STYLE="font-size: 11pt">On</FONT>
|
||||
<FONT SIZE=2 STYLE="font-size: 11pt">Linux the command becomes as
|
||||
following.<BR></FONT><FONT SIZE=2 STYLE="font-size: 11pt"><I>xsltproc
|
||||
-o “%O” /usr/local/kicad/bin/plugins/myconverter .xsl
|
||||
“%I”</I></FONT></FONT></FONT></P>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3><SPAN STYLE="font-variant: normal"><FONT SIZE=2 STYLE="font-size: 11pt"><SPAN STYLE="font-style: normal"><SPAN STYLE="font-weight: normal">Where
|
||||
</SPAN></SPAN></FONT></SPAN><SPAN STYLE="font-variant: normal"><FONT SIZE=2 STYLE="font-size: 11pt"><I><SPAN STYLE="font-weight: normal">myconverter</SPAN></I></FONT></SPAN><FONT SIZE=2 STYLE="font-size: 11pt"><I><SPAN STYLE="font-weight: normal">.xsl</SPAN></I></FONT><SPAN STYLE="font-variant: normal">
|
||||
</SPAN><SPAN STYLE="font-variant: normal"><FONT SIZE=2 STYLE="font-size: 11pt"><SPAN STYLE="font-style: normal"><SPAN STYLE="font-weight: normal">is
|
||||
the style-sheet that you are applying. Do not forget the double
|
||||
quotes</SPAN></SPAN></FONT></SPAN><SPAN STYLE="font-variant: normal">
|
||||
</SPAN><SPAN STYLE="font-variant: normal"><FONT SIZE=2 STYLE="font-size: 11pt"><SPAN STYLE="font-style: normal"><SPAN STYLE="font-weight: normal">around
|
||||
the file names, this allows them to have spaces after the
|
||||
substitution by Eeschema.</SPAN></SPAN></FONT></SPAN></FONT></FONT></P>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3>The command line
|
||||
format accepts parameters for filenames:</FONT></FONT></P>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3>The supported
|
||||
formatting parameters are.</FONT></FONT></P>
|
||||
<UL>
|
||||
<LI><P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3>%B => base
|
||||
filename and path of selected output file, minus path and extension.</FONT></FONT></P>
|
||||
<LI><P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3>%I => complete
|
||||
filename and path of the temporary input file (the intermediate net
|
||||
file).</FONT></FONT></P>
|
||||
<LI><P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3>%O => complete
|
||||
filename and path of the user chosen output file.</FONT></FONT></P>
|
||||
</UL>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3>%I will be replaced
|
||||
by the actual intermediate file name<BR><SPAN STYLE="font-variant: normal"><SPAN STYLE="font-style: normal"><SPAN STYLE="font-weight: normal">%O
|
||||
will be replaced by the actual output file name.</SPAN></SPAN></SPAN></FONT></FONT></P>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3><B>4.3 - Command
|
||||
line format: example for <SPAN STYLE="font-variant: normal"><SPAN STYLE="font-style: normal">xsltproc</SPAN></SPAN></B></FONT></FONT></P>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3><SPAN STYLE="font-variant: normal"><SPAN STYLE="font-style: normal">The
|
||||
command line format for xsltproc is the following:<BR>< path of
|
||||
</SPAN></SPAN>xsltproc > <SPAN STYLE="font-variant: normal"><SPAN STYLE="font-style: normal">xsltproc
|
||||
< </SPAN></SPAN>xsltproc parameters ></FONT></FONT></P>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3>On
|
||||
Windows:<BR><I><B>f:/kicad/bin/xsltproc.exe -o “%O”
|
||||
f:/kicad/bin/plugins/netlist_form_pads-pcb.xsl “%I”</B></I></FONT></FONT></P>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3><FONT SIZE=2 STYLE="font-size: 11pt">On</FONT>
|
||||
<FONT SIZE=2 STYLE="font-size: 11pt">Linux:<BR></FONT><FONT SIZE=2 STYLE="font-size: 11pt"><I><B>xsltproc
|
||||
-o “%O”
|
||||
/usr/local/kicad/bin/plugins/netlist_form_pads-pcb.xsl “%I”</B></I></FONT></FONT></FONT></P>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3><SPAN STYLE="font-variant: normal"><FONT SIZE=2 STYLE="font-size: 11pt"><SPAN STYLE="font-style: normal"><SPAN STYLE="font-weight: normal">The
|
||||
above examples assume</SPAN></SPAN></FONT></SPAN><SPAN STYLE="font-variant: normal">
|
||||
</SPAN><SPAN STYLE="font-variant: normal"><FONT SIZE=2 STYLE="font-size: 11pt"><SPAN STYLE="font-style: normal"><SPAN STYLE="font-weight: normal">xsltproc
|
||||
is installed on your PC under Windows and all files located in
|
||||
kicad/bin.</SPAN></SPAN></FONT></SPAN></FONT></FONT></P>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3><B>4.4 - Command
|
||||
line format: example fo<SPAN STYLE="font-variant: normal"><SPAN STYLE="font-style: normal">r
|
||||
python scripts</SPAN></SPAN></B></FONT></FONT></P>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3>The command line
|
||||
format for python is something like:<BR><SPAN STYLE="font-variant: normal"><SPAN STYLE="font-style: normal">python</SPAN></SPAN><SPAN STYLE="font-variant: normal">
|
||||
</SPAN><SPAN STYLE="font-variant: normal"><SPAN STYLE="font-style: normal"><
|
||||
script file name </SPAN></SPAN>> < input filename > <
|
||||
output filename ></FONT></FONT></P>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3>On
|
||||
Windows:<BR><I><B>python.exe f:/kicad/python/my_python_script.py</B></I>
|
||||
“<I><B>%I” “%O”</B></I></FONT></FONT></P>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3>On Linux:<BR><I><B>python</B></I>
|
||||
<I><B>/usr/local/kicad/python/my_python_script.py</B></I> “<I><B>%I”
|
||||
“%O”</B></I></FONT></FONT></P>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
|
||||
<FONT FACE="Times New Roman, serif"><FONT SIZE=3>Assuming python is
|
||||
installed on your PC.</FONT></FONT></P>
|
||||
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto"><A NAME="__RefHeading__1787_435485510"></A>
|
||||
<BR>
|
||||
</P>
|
||||
</BODY>
|
||||
</HTML>
|
|
@ -1,591 +0,0 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2012 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
||||
* 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
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file dialog_build_BOM.cpp
|
||||
*/
|
||||
|
||||
#include <fctsys.h>
|
||||
#include <appl_wxstruct.h>
|
||||
#include <confirm.h>
|
||||
#include <gestfich.h>
|
||||
#include <kicad_string.h>
|
||||
#include <class_sch_screen.h>
|
||||
#include <wxstruct.h>
|
||||
#include <build_version.h>
|
||||
|
||||
#include <netlist.h>
|
||||
#include <template_fieldnames.h>
|
||||
#include <sch_component.h>
|
||||
#include <sch_sheet.h>
|
||||
#include <class_library.h>
|
||||
|
||||
#include <wx/valgen.h>
|
||||
|
||||
#include <dialog_build_BOM.h>
|
||||
#include <BOM_lister.h>
|
||||
|
||||
|
||||
/* Local variables */
|
||||
static bool s_ListByRef = true;
|
||||
static bool s_ListByValue = true;
|
||||
static bool s_ListWithSubCmponents;
|
||||
static bool s_ListHierarchicalPinByName;
|
||||
static bool s_ListHierarchicalPinBySheet;
|
||||
static bool s_BrowseCreatedList;
|
||||
static int s_OutputFormOpt;
|
||||
static int s_OutputSeparatorOpt;
|
||||
static bool s_Add_Location = false;
|
||||
static bool s_Add_FpField_state = true;
|
||||
static bool s_Add_DatasheetField_state;
|
||||
static bool s_Add_F1_state;
|
||||
static bool s_Add_F2_state;
|
||||
static bool s_Add_F3_state;
|
||||
static bool s_Add_F4_state;
|
||||
static bool s_Add_F5_state;
|
||||
static bool s_Add_F6_state;
|
||||
static bool s_Add_F7_state;
|
||||
static bool s_Add_F8_state;
|
||||
static bool s_Add_Alls_state;
|
||||
static char s_ExportSeparatorSymbol;
|
||||
|
||||
|
||||
static bool* s_AddFieldList[] =
|
||||
{
|
||||
&s_Add_FpField_state,
|
||||
&s_Add_F1_state,
|
||||
&s_Add_F2_state,
|
||||
&s_Add_F3_state,
|
||||
&s_Add_F4_state,
|
||||
&s_Add_F5_state,
|
||||
&s_Add_F6_state,
|
||||
&s_Add_F7_state,
|
||||
&s_Add_F8_state,
|
||||
&s_Add_Alls_state,
|
||||
&s_Add_DatasheetField_state,
|
||||
NULL
|
||||
};
|
||||
|
||||
|
||||
const wxString OPTION_BOM_LIST_REF( wxT("BomListPerRef") );
|
||||
const wxString OPTION_BOM_LIST_VALUE( wxT("BomListPerValue") );
|
||||
const wxString OPTION_BOM_LIST_HPINS( wxT("BomListPerHPins") );
|
||||
const wxString OPTION_BOM_LIST_HPINS_BY_SHEET( wxT("BomListHPinsPerSheet") );
|
||||
const wxString OPTION_BOM_LIST_HPINS_BY_NAME_( wxT("BomListHPinsPerName") );
|
||||
const wxString OPTION_BOM_LIST_SUB_CMP( wxT("BomListSubCmps") );
|
||||
|
||||
const wxString OPTION_BOM_FORMAT( wxT("BomFormat") );
|
||||
const wxString OPTION_BOM_LAUNCH_BROWSER( wxT("BomLaunchBrowser") );
|
||||
const wxString OPTION_BOM_SEPARATOR( wxT("BomExportSeparator") );
|
||||
const wxString OPTION_BOM_ADD_FIELD ( wxT("BomAddField") );
|
||||
const wxString OPTION_BOM_ADD_LOCATION ( wxT("BomAddLocation") );
|
||||
|
||||
/* list of separators used in bom export to spreadsheet
|
||||
* (selected by s_OutputSeparatorOpt, and s_OutputSeparatorOpt radiobox)
|
||||
*/
|
||||
static char s_ExportSeparator[] = ("\t;,.");
|
||||
|
||||
/*!
|
||||
* DIALOG_BUILD_BOM dialog type definition
|
||||
*/
|
||||
|
||||
|
||||
DIALOG_BUILD_BOM::DIALOG_BUILD_BOM( EDA_DRAW_FRAME* parent ) :
|
||||
DIALOG_BUILD_BOM_BASE( parent )
|
||||
{
|
||||
m_config = wxGetApp().GetSettings();
|
||||
wxASSERT( m_config != NULL );
|
||||
|
||||
m_parent = parent;
|
||||
|
||||
Init();
|
||||
|
||||
if( GetSizer() )
|
||||
{
|
||||
GetSizer()->SetSizeHints( this );
|
||||
}
|
||||
Centre();
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Init Controls for DIALOG_BUILD_BOM
|
||||
*/
|
||||
|
||||
void DIALOG_BUILD_BOM::Init()
|
||||
{
|
||||
SetFocus();
|
||||
|
||||
/* Get options */
|
||||
m_config->Read( OPTION_BOM_LIST_REF, &s_ListByRef );
|
||||
m_config->Read( OPTION_BOM_LIST_VALUE , &s_ListByValue );
|
||||
m_config->Read( OPTION_BOM_LIST_HPINS, &s_ListHierarchicalPinByName );
|
||||
m_config->Read( OPTION_BOM_LIST_HPINS_BY_SHEET, &s_ListWithSubCmponents );
|
||||
m_config->Read( OPTION_BOM_LIST_HPINS_BY_NAME_, &s_ListWithSubCmponents );
|
||||
m_config->Read( OPTION_BOM_LIST_SUB_CMP, &s_ListWithSubCmponents );
|
||||
m_config->Read( OPTION_BOM_LIST_HPINS_BY_SHEET, &s_ListHierarchicalPinBySheet );
|
||||
m_config->Read( OPTION_BOM_LIST_HPINS_BY_NAME_, &s_ListHierarchicalPinByName );
|
||||
s_OutputFormOpt = m_config->Read( OPTION_BOM_FORMAT, 0l );
|
||||
m_config->Read( OPTION_BOM_LAUNCH_BROWSER, &s_BrowseCreatedList );
|
||||
s_OutputSeparatorOpt = m_config->Read( OPTION_BOM_SEPARATOR, 0l );
|
||||
m_config->Read( OPTION_BOM_ADD_LOCATION, &s_Add_Location );
|
||||
|
||||
long addfields = m_config->Read( OPTION_BOM_ADD_FIELD, 0l );
|
||||
for( int ii = 0, bitmask = 1; s_AddFieldList[ii] != NULL; ii++ )
|
||||
{
|
||||
if( (addfields & bitmask) )
|
||||
*s_AddFieldList[ii] = true;
|
||||
else
|
||||
*s_AddFieldList[ii] = false;
|
||||
|
||||
bitmask <<= 1;
|
||||
}
|
||||
|
||||
// Set validators
|
||||
m_ListCmpbyRefItems->SetValidator( wxGenericValidator( &s_ListByRef ) );
|
||||
m_ListSubCmpItems->SetValidator( wxGenericValidator( &s_ListWithSubCmponents ) );
|
||||
m_ListCmpbyValItems->SetValidator( wxGenericValidator( &s_ListByValue ) );
|
||||
m_GenListLabelsbyVal->SetValidator( wxGenericValidator( &s_ListHierarchicalPinByName ) );
|
||||
m_GenListLabelsbySheet->SetValidator( wxGenericValidator( &s_ListHierarchicalPinBySheet ) );
|
||||
m_OutputFormCtrl->SetValidator( wxGenericValidator( &s_OutputFormOpt ) );
|
||||
m_OutputSeparatorCtrl->SetValidator( wxGenericValidator( &s_OutputSeparatorOpt ) );
|
||||
m_GetListBrowser->SetValidator( wxGenericValidator( &s_BrowseCreatedList ) );
|
||||
|
||||
m_AddLocationField->SetValidator( wxGenericValidator( &s_Add_Location ) );
|
||||
m_AddFootprintField->SetValidator( wxGenericValidator( &s_Add_FpField_state ) );
|
||||
m_AddDatasheetField->SetValidator( wxGenericValidator( &s_Add_DatasheetField_state ) );
|
||||
m_AddField1->SetValidator( wxGenericValidator( &s_Add_F1_state ) );
|
||||
m_AddField2->SetValidator( wxGenericValidator( &s_Add_F2_state ) );
|
||||
m_AddField3->SetValidator( wxGenericValidator( &s_Add_F3_state ) );
|
||||
m_AddField4->SetValidator( wxGenericValidator( &s_Add_F4_state ) );
|
||||
m_AddField5->SetValidator( wxGenericValidator( &s_Add_F5_state ) );
|
||||
m_AddField6->SetValidator( wxGenericValidator( &s_Add_F6_state ) );
|
||||
m_AddField7->SetValidator( wxGenericValidator( &s_Add_F7_state ) );
|
||||
m_AddField8->SetValidator( wxGenericValidator( &s_Add_F8_state ) );
|
||||
m_AddAllFields->SetValidator( wxGenericValidator( &s_Add_Alls_state ) );
|
||||
|
||||
m_OutputFormCtrl->SetSelection( s_OutputFormOpt );
|
||||
m_OutputSeparatorCtrl->SetSelection( s_OutputSeparatorOpt );
|
||||
|
||||
// Enable/disable options:
|
||||
wxCommandEvent dummy;
|
||||
OnRadioboxSelectFormatSelected( dummy );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Called on BOM format selection:
|
||||
* Enable/disable options in dialog
|
||||
*/
|
||||
void DIALOG_BUILD_BOM::OnRadioboxSelectFormatSelected( wxCommandEvent& event )
|
||||
{
|
||||
switch( m_OutputFormCtrl->GetSelection() )
|
||||
{
|
||||
case 0: // Human readable text full report
|
||||
m_OutputSeparatorCtrl->Enable( false );
|
||||
m_ListCmpbyRefItems->Enable( true );
|
||||
m_ListCmpbyValItems->Enable( true );
|
||||
m_GenListLabelsbyVal->Enable( true );
|
||||
m_GenListLabelsbySheet->Enable( true );
|
||||
m_ListSubCmpItems->Enable( true );
|
||||
m_AddLocationField->Enable( true );
|
||||
break;
|
||||
|
||||
case 1: // Csv format, full list by reference
|
||||
m_OutputSeparatorCtrl->Enable( true );
|
||||
m_ListCmpbyRefItems->Enable( false );
|
||||
m_ListCmpbyValItems->Enable( false );
|
||||
m_GenListLabelsbyVal->Enable( false );
|
||||
m_GenListLabelsbySheet->Enable( false );
|
||||
m_ListSubCmpItems->Enable( true );
|
||||
m_AddLocationField->Enable( true );
|
||||
break;
|
||||
|
||||
case 2: // Csv format, grouped list by reference
|
||||
m_OutputSeparatorCtrl->Enable( true );
|
||||
m_ListCmpbyRefItems->Enable( false );
|
||||
m_ListCmpbyValItems->Enable( false );
|
||||
m_GenListLabelsbyVal->Enable( false );
|
||||
m_GenListLabelsbySheet->Enable( false );
|
||||
m_ListSubCmpItems->Enable( false );
|
||||
m_AddLocationField->Enable( false );
|
||||
break;
|
||||
|
||||
case 3: // Csv format, short list by values
|
||||
m_OutputSeparatorCtrl->Enable( true );
|
||||
m_ListCmpbyRefItems->Enable( false );
|
||||
m_ListCmpbyValItems->Enable( false );
|
||||
m_GenListLabelsbyVal->Enable( false );
|
||||
m_GenListLabelsbySheet->Enable( false );
|
||||
m_ListSubCmpItems->Enable( false );
|
||||
m_AddLocationField->Enable( false );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_OK
|
||||
*/
|
||||
|
||||
void DIALOG_BUILD_BOM::OnOkClick( wxCommandEvent& event )
|
||||
{
|
||||
char ExportSeparatorSymbol = s_ExportSeparator[0];
|
||||
|
||||
if( m_OutputSeparatorCtrl->GetSelection() > 0 )
|
||||
ExportSeparatorSymbol = s_ExportSeparator[m_OutputSeparatorCtrl->GetSelection()];
|
||||
|
||||
int ExportFileType = m_OutputFormCtrl->GetSelection();
|
||||
|
||||
SavePreferences();
|
||||
|
||||
Create_BOM_Lists( ExportFileType, m_ListSubCmpItems->GetValue(),
|
||||
ExportSeparatorSymbol, m_GetListBrowser->GetValue() );
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_CANCEL
|
||||
*/
|
||||
|
||||
void DIALOG_BUILD_BOM::OnCancelClick( wxCommandEvent& event )
|
||||
{
|
||||
EndModal( -1 );
|
||||
}
|
||||
|
||||
|
||||
void DIALOG_BUILD_BOM::SavePreferences()
|
||||
{
|
||||
// Determine current settings of "List items" and "Options" checkboxes
|
||||
s_ListByRef = m_ListCmpbyRefItems->GetValue();
|
||||
s_ListWithSubCmponents = m_ListSubCmpItems->GetValue();
|
||||
s_ListByValue = m_ListCmpbyValItems->GetValue();
|
||||
s_ListHierarchicalPinByName = m_GenListLabelsbyVal->GetValue();
|
||||
s_ListHierarchicalPinBySheet = m_GenListLabelsbySheet->GetValue();
|
||||
s_BrowseCreatedList = m_GetListBrowser->GetValue();
|
||||
|
||||
// (saved in config ):
|
||||
|
||||
// Determine current settings of both radiobutton groups
|
||||
s_OutputFormOpt = m_OutputFormCtrl->GetSelection();
|
||||
s_OutputSeparatorOpt = m_OutputSeparatorCtrl->GetSelection();
|
||||
|
||||
if( s_OutputSeparatorOpt < 0 )
|
||||
s_OutputSeparatorOpt = 0;
|
||||
|
||||
// Determine current settings of all "Fields to add" checkboxes
|
||||
s_Add_Location = m_AddLocationField->GetValue();
|
||||
s_Add_FpField_state = m_AddFootprintField->GetValue();
|
||||
s_Add_DatasheetField_state = m_AddDatasheetField->GetValue();
|
||||
s_Add_F1_state = m_AddField1->GetValue();
|
||||
s_Add_F2_state = m_AddField2->GetValue();
|
||||
s_Add_F3_state = m_AddField3->GetValue();
|
||||
s_Add_F4_state = m_AddField4->GetValue();
|
||||
s_Add_F5_state = m_AddField5->GetValue();
|
||||
s_Add_F6_state = m_AddField6->GetValue();
|
||||
s_Add_F7_state = m_AddField7->GetValue();
|
||||
s_Add_F8_state = m_AddField8->GetValue();
|
||||
s_Add_Alls_state = m_AddAllFields->GetValue();
|
||||
|
||||
// Now save current settings of both radiobutton groups
|
||||
m_config->Write( OPTION_BOM_LIST_REF, s_ListByRef );
|
||||
m_config->Write( OPTION_BOM_LIST_VALUE , s_ListByValue );
|
||||
m_config->Write( OPTION_BOM_LIST_HPINS, s_ListHierarchicalPinByName );
|
||||
m_config->Write( OPTION_BOM_LIST_HPINS_BY_SHEET, s_ListHierarchicalPinBySheet );
|
||||
m_config->Write( OPTION_BOM_LIST_HPINS_BY_NAME_, s_ListHierarchicalPinByName );
|
||||
m_config->Write( OPTION_BOM_LIST_SUB_CMP, s_ListWithSubCmponents );
|
||||
|
||||
m_config->Write( OPTION_BOM_FORMAT, (long) s_OutputFormOpt );
|
||||
m_config->Write( OPTION_BOM_SEPARATOR, (long) s_OutputSeparatorOpt );
|
||||
m_config->Write( OPTION_BOM_LAUNCH_BROWSER, (long) s_BrowseCreatedList );
|
||||
|
||||
// Now save current settings of all "Fields to add" checkboxes
|
||||
m_config->Write( OPTION_BOM_ADD_LOCATION, s_Add_Location );
|
||||
|
||||
long addfields = 0;
|
||||
for( int ii = 0, bitmask = 1; s_AddFieldList[ii] != NULL; ii++ )
|
||||
{
|
||||
if( *s_AddFieldList[ii] )
|
||||
addfields |= bitmask;
|
||||
|
||||
bitmask <<= 1;
|
||||
}
|
||||
|
||||
m_config->Write( OPTION_BOM_ADD_FIELD, addfields );
|
||||
}
|
||||
|
||||
|
||||
void DIALOG_BUILD_BOM::Create_BOM_Lists( int aTypeFile,
|
||||
bool aIncludeSubComponents,
|
||||
char aExportSeparatorSymbol,
|
||||
bool aRunBrowser )
|
||||
{
|
||||
wxString wildcard;
|
||||
|
||||
static wxFileName fn;
|
||||
|
||||
wxFileName current = g_RootSheet->GetScreen()->GetFileName();
|
||||
|
||||
s_ExportSeparatorSymbol = aExportSeparatorSymbol;
|
||||
|
||||
if( !fn.HasName() || fn.GetName()==NAMELESS_PROJECT )
|
||||
{
|
||||
fn.SetName( current.GetName() );
|
||||
}
|
||||
// else use a previous run's name, because fn was set before and user
|
||||
// is probably just iteratively refining the BOM.
|
||||
|
||||
if( fn.GetPath().IsEmpty() )
|
||||
{
|
||||
fn.SetPath( current.GetPath() );
|
||||
}
|
||||
// else use a previous run's path, because fn was set before and user
|
||||
// is probably just iteratively refining the BOM.
|
||||
|
||||
wxString bomDesc = _( "Bill of Materials" ); // translate once, use twice.
|
||||
|
||||
if( aTypeFile == 0 )
|
||||
{
|
||||
fn.SetExt( wxT( "lst" ) );
|
||||
wildcard = bomDesc + wxT( " (*.lst)|*.lst" );
|
||||
}
|
||||
else
|
||||
{
|
||||
fn.SetExt( wxT( "csv" ) );
|
||||
wildcard = bomDesc + wxT( " (*.csv)|*.csv" );
|
||||
}
|
||||
|
||||
wxFileDialog dlg( this, bomDesc, fn.GetPath(),
|
||||
fn.GetFullName(), wildcard, wxFD_SAVE );
|
||||
|
||||
if( dlg.ShowModal() == wxID_CANCEL )
|
||||
return;
|
||||
|
||||
fn = dlg.GetPath(); // remember path+filename+ext for subsequent runs.
|
||||
|
||||
m_listFileName = dlg.GetPath();
|
||||
|
||||
// Close dialog, then show the list (if so requested)
|
||||
|
||||
switch( aTypeFile )
|
||||
{
|
||||
case 0: // list
|
||||
CreatePartsAndLabelsFullList( aIncludeSubComponents );
|
||||
break;
|
||||
|
||||
case 1: // spreadsheet, Single Part per line
|
||||
CreateSpreadSheetPartsFullList( aIncludeSubComponents, s_Add_Location, false );
|
||||
break;
|
||||
|
||||
case 2: // spreadsheet, group Part with same fields per line
|
||||
CreateSpreadSheetPartsFullList( aIncludeSubComponents, s_Add_Location, true );
|
||||
break;
|
||||
|
||||
case 3: // spreadsheet, one value per line and no sub-component
|
||||
CreateSpreadSheetPartsShortList();
|
||||
break;
|
||||
}
|
||||
|
||||
EndModal( 1 );
|
||||
|
||||
if( aRunBrowser )
|
||||
{
|
||||
wxString editorname = wxGetApp().GetEditorName();
|
||||
wxString filename = m_listFileName;
|
||||
AddDelimiterString( filename );
|
||||
ExecuteFile( this, editorname, filename );
|
||||
}
|
||||
}
|
||||
|
||||
/** Helper function IsFieldChecked
|
||||
* return the state of the wxCheckbox corresponding to the
|
||||
* field aFieldId (FOOTPRINT, DATASHEET and FIELD1 to FIELD8
|
||||
* if the option "All user fields" is checked, return always true
|
||||
* for fileds ids >= FIELD1
|
||||
* @param aFieldId = the field id : FOOTPRINT to FIELD8
|
||||
*/
|
||||
bool DIALOG_BUILD_BOM::IsFieldChecked(int aFieldId)
|
||||
{
|
||||
if( m_AddAllFields->IsChecked() && (aFieldId>= FIELD1) )
|
||||
return true;
|
||||
|
||||
switch ( aFieldId )
|
||||
{
|
||||
case FIELD1:
|
||||
return m_AddField1->IsChecked();
|
||||
case FIELD2:
|
||||
return m_AddField2->IsChecked();
|
||||
case FIELD3:
|
||||
return m_AddField3->IsChecked();
|
||||
case FIELD4:
|
||||
return m_AddField4->IsChecked();
|
||||
case FIELD5:
|
||||
return m_AddField5->IsChecked();
|
||||
case FIELD6:
|
||||
return m_AddField6->IsChecked();
|
||||
case FIELD7:
|
||||
return m_AddField7->IsChecked();
|
||||
case FIELD8:
|
||||
return m_AddField8->IsChecked();
|
||||
case FOOTPRINT:
|
||||
return m_AddFootprintField->IsChecked();
|
||||
case DATASHEET:
|
||||
return m_AddDatasheetField->IsChecked();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/* Prints a list of components, in a form which can be imported by a spreadsheet.
|
||||
* components having the same value and the same footprint
|
||||
* are grouped on the same line
|
||||
* Form is:
|
||||
* value; number of components; list of references; <footprint>; <field1>; ...;
|
||||
* list is sorted by values
|
||||
*/
|
||||
void DIALOG_BUILD_BOM::CreateSpreadSheetPartsShortList( )
|
||||
{
|
||||
FILE* f;
|
||||
|
||||
if( ( f = wxFopen( m_listFileName, wxT( "wt" ) ) ) == NULL )
|
||||
{
|
||||
wxString msg;
|
||||
msg.Printf( _( "Failed to open file <%s>" ), GetChars(m_listFileName) );
|
||||
DisplayError( this, msg );
|
||||
return;
|
||||
}
|
||||
|
||||
BOM_LISTER bom_lister;
|
||||
bom_lister.SetCvsFormOn( s_ExportSeparatorSymbol );
|
||||
|
||||
// Set the list of fields to add to list
|
||||
for( int ii = FOOTPRINT; ii <= FIELD8; ii++ )
|
||||
if( IsFieldChecked( ii ) )
|
||||
bom_lister.AddFieldIdToPrintList( ii );
|
||||
// Write the list of components grouped by values:
|
||||
bom_lister.CreateCsvBOMListByValues( f );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Print a list of components, in a form which can be imported by a spreadsheet
|
||||
* form is:
|
||||
* cmp ref; cmp val; fields;
|
||||
* Components are sorted by reference
|
||||
* param aIncludeSubComponents = true to print sub components
|
||||
* param aPrintLocation = true to print components location
|
||||
* (only possible when aIncludeSubComponents == true)
|
||||
* param aGroupRefs = true to group components references, when other fieds
|
||||
* have the same value
|
||||
*/
|
||||
void DIALOG_BUILD_BOM::CreateSpreadSheetPartsFullList( bool aIncludeSubComponents,
|
||||
bool aPrintLocation,
|
||||
bool aGroupRefs )
|
||||
{
|
||||
FILE* f;
|
||||
wxString msg;
|
||||
|
||||
if( ( f = wxFopen( m_listFileName, wxT( "wt" ) ) ) == NULL )
|
||||
{
|
||||
msg.Printf( _( "Failed to open file <%s>" ), GetChars( m_listFileName ) );
|
||||
DisplayError( this, msg );
|
||||
return;
|
||||
}
|
||||
|
||||
BOM_LISTER bom_lister;
|
||||
bom_lister.SetCvsFormOn( s_ExportSeparatorSymbol );
|
||||
|
||||
// Set group refs option (hight priority):
|
||||
// Obvioulsy only useful when not including sub-components
|
||||
bom_lister.SetGroupReferences( aGroupRefs );
|
||||
bom_lister.SetIncludeSubCmp( aIncludeSubComponents && !aGroupRefs );
|
||||
|
||||
// Set print location option:
|
||||
// Obvioulsy only possible when including sub components
|
||||
// and not grouping references
|
||||
bom_lister.SetPrintLocation( aPrintLocation && !aGroupRefs &&
|
||||
aIncludeSubComponents );
|
||||
|
||||
// Set the list of fields to add to list
|
||||
for( int ii = FOOTPRINT; ii <= FIELD8; ii++ )
|
||||
if( IsFieldChecked( ii ) )
|
||||
bom_lister.AddFieldIdToPrintList( ii );
|
||||
|
||||
// create the file
|
||||
bom_lister.PrintComponentsListByReferenceCsvForm( f );
|
||||
|
||||
fclose( f );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* CreatePartsAndLabelsFullList()
|
||||
* Main function to create the list of components and/or labels
|
||||
* (global labels, hierarchical labels and pin sheets )
|
||||
*/
|
||||
void DIALOG_BUILD_BOM::CreatePartsAndLabelsFullList( bool aIncludeSubComponents )
|
||||
{
|
||||
FILE* f;
|
||||
wxString msg;
|
||||
|
||||
if( ( f = wxFopen( m_listFileName, wxT( "wt" ) ) ) == NULL )
|
||||
{
|
||||
msg.Printf( _( "Failed to open file <%s>" ), GetChars( m_listFileName ) );
|
||||
DisplayError( this, msg );
|
||||
return;
|
||||
}
|
||||
|
||||
BOM_LISTER bom_lister;
|
||||
bom_lister.SetIncludeSubCmp( aIncludeSubComponents );
|
||||
bom_lister.SetCvsFormOff();
|
||||
bom_lister.SetPrintLocation( s_Add_Location );
|
||||
// Set the list of fields to add to list
|
||||
for( int ii = FOOTPRINT; ii <= FIELD8; ii++ )
|
||||
if( IsFieldChecked( ii ) )
|
||||
bom_lister.AddFieldIdToPrintList( ii );
|
||||
|
||||
// creates the list file
|
||||
wxString Title = wxGetApp().GetAppName() + wxT( " " ) + GetBuildVersion();
|
||||
|
||||
fprintf( f, "%s >> Creation date: %s\n", TO_UTF8( Title ), TO_UTF8( DateAndTime() ) );
|
||||
|
||||
if( m_ListCmpbyRefItems->GetValue() )
|
||||
bom_lister.PrintComponentsListByReferenceHumanReadable( f );
|
||||
|
||||
if( m_ListCmpbyValItems->GetValue() )
|
||||
bom_lister.PrintComponentsListByValue( f );
|
||||
|
||||
// Create list of global labels, hierachical labels and pins sheets
|
||||
|
||||
if( m_GenListLabelsbySheet->GetValue() )
|
||||
bom_lister.PrintGlobalAndHierarchicalLabelsList( f, true );
|
||||
|
||||
if( m_GenListLabelsbyVal->GetValue() )
|
||||
bom_lister.PrintGlobalAndHierarchicalLabelsList( f, false );
|
||||
|
||||
msg = _( "\n#End List\n" );
|
||||
fprintf( f, "%s", TO_UTF8( msg ) );
|
||||
fclose( f );
|
||||
}
|
|
@ -1,94 +0,0 @@
|
|||
/**
|
||||
* @file dialog_build_BOM.h
|
||||
*/
|
||||
|
||||
/* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 1992-2012 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
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _DIALOG_BUILD_BOM_H_
|
||||
#define _DIALOG_BUILD_BOM_H_
|
||||
|
||||
#include <dialog_build_BOM_base.h>
|
||||
|
||||
|
||||
class EDA_DRAW_FRAME;
|
||||
class SCH_COMPONENT;
|
||||
class wxConfig;
|
||||
|
||||
class DIALOG_BUILD_BOM : public DIALOG_BUILD_BOM_BASE
|
||||
{
|
||||
private:
|
||||
EDA_DRAW_FRAME* m_parent;
|
||||
wxConfig* m_config;
|
||||
wxString m_listFileName; // The full filename of the file report.
|
||||
|
||||
private:
|
||||
void OnRadioboxSelectFormatSelected( wxCommandEvent& event );
|
||||
void OnOkClick( wxCommandEvent& event );
|
||||
void OnCancelClick( wxCommandEvent& event );
|
||||
|
||||
void SavePreferences();
|
||||
void Init();
|
||||
void Create_BOM_Lists( int aTypeFile,
|
||||
bool aIncludeSubComponents,
|
||||
char aExportSeparatorSymbol,
|
||||
bool aRunBrowser );
|
||||
|
||||
void CreatePartsAndLabelsFullList( bool aIncludeSubComponents );
|
||||
|
||||
/**
|
||||
* Function CreateSpreadSheetPartsFullList
|
||||
* prints a list of components, in a form which can be imported by a
|
||||
* spreadsheet. Form is:
|
||||
* reference; cmp value; \<footprint\>; \<field1\>; ...;
|
||||
* Components are sorted by reference
|
||||
* @param aIncludeSubComponents = true to print sub components
|
||||
* @param aPrintLocation = true to print components location
|
||||
* (only possible when aIncludeSubComponents == true)
|
||||
* @param aGroupRefs = true to group components references, when other fieds
|
||||
* have the same value
|
||||
*/
|
||||
void CreateSpreadSheetPartsFullList( bool aIncludeSubComponents,
|
||||
bool aPrintLocation,
|
||||
bool aGroupRefs );
|
||||
|
||||
/**
|
||||
* Function CreateSpreadSheetPartsShortList
|
||||
* prints a list of components, in a form which can be imported by a spreadsheet.
|
||||
* components having the same value and the same footprint
|
||||
* are grouped on the same line
|
||||
* Form is:
|
||||
* value; number of components; list of references; \<footprint\>; \<field1\>; ...;
|
||||
* list is sorted by values
|
||||
*/
|
||||
void CreateSpreadSheetPartsShortList();
|
||||
|
||||
bool IsFieldChecked( int aFieldId );
|
||||
|
||||
public:
|
||||
DIALOG_BUILD_BOM( EDA_DRAW_FRAME* parent );
|
||||
|
||||
// ~DIALOG_BUILD_BOM() {};
|
||||
};
|
||||
|
||||
#endif // _DIALOG_BUILD_BOM_H_
|
|
@ -1,157 +0,0 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Oct 8 2012)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "dialog_build_BOM_base.h"
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
DIALOG_BUILD_BOM_BASE::DIALOG_BUILD_BOM_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style )
|
||||
{
|
||||
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
|
||||
|
||||
wxBoxSizer* bMainSizer;
|
||||
bMainSizer = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
wxBoxSizer* bSizerUpper;
|
||||
bSizerUpper = new wxBoxSizer( wxHORIZONTAL );
|
||||
|
||||
wxStaticBoxSizer* sbOptionsSizer;
|
||||
sbOptionsSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Options:") ), wxVERTICAL );
|
||||
|
||||
wxStaticBoxSizer* sbListOptionsSizer;
|
||||
sbListOptionsSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("List items:") ), wxVERTICAL );
|
||||
|
||||
m_ListCmpbyRefItems = new wxCheckBox( this, wxID_ANY, _("Components by reference"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
sbListOptionsSizer->Add( m_ListCmpbyRefItems, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_ListSubCmpItems = new wxCheckBox( this, wxID_ANY, _("Sub components (i.e. U2A, U2B ...)"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
sbListOptionsSizer->Add( m_ListSubCmpItems, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_ListCmpbyValItems = new wxCheckBox( this, wxID_ANY, _("Components by value"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
sbListOptionsSizer->Add( m_ListCmpbyValItems, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_GenListLabelsbyVal = new wxCheckBox( this, wxID_ANY, _("Hierarchical pins by name"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
sbListOptionsSizer->Add( m_GenListLabelsbyVal, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_GenListLabelsbySheet = new wxCheckBox( this, wxID_ANY, _("Hierarchical pins by sheet"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
sbListOptionsSizer->Add( m_GenListLabelsbySheet, 0, wxALL, 5 );
|
||||
|
||||
|
||||
sbOptionsSizer->Add( sbListOptionsSizer, 0, wxEXPAND, 5 );
|
||||
|
||||
wxString m_OutputFormCtrlChoices[] = { _("List"), _("List for spreadsheet import (by ref)"), _("List for spreadsheet import (by grouped ref)"), _("List for spreadsheet import (by value)") };
|
||||
int m_OutputFormCtrlNChoices = sizeof( m_OutputFormCtrlChoices ) / sizeof( wxString );
|
||||
m_OutputFormCtrl = new wxRadioBox( this, ID_RADIOBOX_SELECT_FORMAT, _("Output format:"), wxDefaultPosition, wxDefaultSize, m_OutputFormCtrlNChoices, m_OutputFormCtrlChoices, 1, wxRA_SPECIFY_COLS );
|
||||
m_OutputFormCtrl->SetSelection( 1 );
|
||||
sbOptionsSizer->Add( m_OutputFormCtrl, 0, wxEXPAND|wxTOP, 5 );
|
||||
|
||||
wxString m_OutputSeparatorCtrlChoices[] = { _("Tab"), _(";"), _(",") };
|
||||
int m_OutputSeparatorCtrlNChoices = sizeof( m_OutputSeparatorCtrlChoices ) / sizeof( wxString );
|
||||
m_OutputSeparatorCtrl = new wxRadioBox( this, wxID_ANY, _("Field separator for spreadsheet import:"), wxDefaultPosition, wxDefaultSize, m_OutputSeparatorCtrlNChoices, m_OutputSeparatorCtrlChoices, 1, wxRA_SPECIFY_ROWS );
|
||||
m_OutputSeparatorCtrl->SetSelection( 0 );
|
||||
sbOptionsSizer->Add( m_OutputSeparatorCtrl, 0, wxEXPAND|wxTOP, 5 );
|
||||
|
||||
m_GetListBrowser = new wxCheckBox( this, wxID_ANY, _("Launch list browser"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
sbOptionsSizer->Add( m_GetListBrowser, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
bSizerUpper->Add( sbOptionsSizer, 3, wxALL|wxEXPAND, 5 );
|
||||
|
||||
wxBoxSizer* bRightSizer;
|
||||
bRightSizer = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
wxStaticBoxSizer* sbAddToListSelectionSizer;
|
||||
sbAddToListSelectionSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Add to list:") ), wxVERTICAL );
|
||||
|
||||
m_AddLocationField = new wxCheckBox( this, wxID_ANY, _("Component location"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
sbAddToListSelectionSizer->Add( m_AddLocationField, 0, wxALL, 5 );
|
||||
|
||||
wxStaticBoxSizer* sbFixedFieldsSizer;
|
||||
sbFixedFieldsSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("System Fields:") ), wxVERTICAL );
|
||||
|
||||
m_AddDatasheetField = new wxCheckBox( this, wxID_ANY, _("Datasheet"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
sbFixedFieldsSizer->Add( m_AddDatasheetField, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_AddFootprintField = new wxCheckBox( this, wxID_ANY, _("Footprint"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
sbFixedFieldsSizer->Add( m_AddFootprintField, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
sbAddToListSelectionSizer->Add( sbFixedFieldsSizer, 0, wxEXPAND, 5 );
|
||||
|
||||
wxStaticBoxSizer* sbUsersFiledsSizer;
|
||||
sbUsersFiledsSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Users fields:") ), wxVERTICAL );
|
||||
|
||||
m_AddField1 = new wxCheckBox( this, wxID_ANY, _("Field 1"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
sbUsersFiledsSizer->Add( m_AddField1, 0, wxEXPAND|wxALL, 5 );
|
||||
|
||||
m_AddField2 = new wxCheckBox( this, wxID_ANY, _("Field 2"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
sbUsersFiledsSizer->Add( m_AddField2, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_AddField3 = new wxCheckBox( this, wxID_ANY, _("Field 3"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
sbUsersFiledsSizer->Add( m_AddField3, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_AddField4 = new wxCheckBox( this, wxID_ANY, _("Field 4"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
sbUsersFiledsSizer->Add( m_AddField4, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_AddField5 = new wxCheckBox( this, wxID_ANY, _("Field 5"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
sbUsersFiledsSizer->Add( m_AddField5, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_AddField6 = new wxCheckBox( this, wxID_ANY, _("Field 6"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
sbUsersFiledsSizer->Add( m_AddField6, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_AddField7 = new wxCheckBox( this, wxID_ANY, _("Field 7"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
sbUsersFiledsSizer->Add( m_AddField7, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_AddField8 = new wxCheckBox( this, wxID_ANY, _("Field 8"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
sbUsersFiledsSizer->Add( m_AddField8, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
|
||||
sbAddToListSelectionSizer->Add( sbUsersFiledsSizer, 0, wxEXPAND|wxTOP, 5 );
|
||||
|
||||
m_AddAllFields = new wxCheckBox( this, wxID_ANY, _("All existing user fields"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
sbAddToListSelectionSizer->Add( m_AddAllFields, 0, wxALL, 5 );
|
||||
|
||||
|
||||
bRightSizer->Add( sbAddToListSelectionSizer, 1, wxEXPAND, 5 );
|
||||
|
||||
|
||||
bSizerUpper->Add( bRightSizer, 2, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
bMainSizer->Add( bSizerUpper, 1, wxEXPAND, 5 );
|
||||
|
||||
m_staticline1 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
||||
bMainSizer->Add( m_staticline1, 0, wxEXPAND|wxLEFT|wxRIGHT, 5 );
|
||||
|
||||
m_sdbSizer = new wxStdDialogButtonSizer();
|
||||
m_sdbSizerOK = new wxButton( this, wxID_OK );
|
||||
m_sdbSizer->AddButton( m_sdbSizerOK );
|
||||
m_sdbSizerCancel = new wxButton( this, wxID_CANCEL );
|
||||
m_sdbSizer->AddButton( m_sdbSizerCancel );
|
||||
m_sdbSizer->Realize();
|
||||
|
||||
bMainSizer->Add( m_sdbSizer, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
this->SetSizer( bMainSizer );
|
||||
this->Layout();
|
||||
bMainSizer->Fit( this );
|
||||
|
||||
// Connect Events
|
||||
m_OutputFormCtrl->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_BUILD_BOM_BASE::OnRadioboxSelectFormatSelected ), NULL, this );
|
||||
m_sdbSizerCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_BUILD_BOM_BASE::OnCancelClick ), NULL, this );
|
||||
m_sdbSizerOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_BUILD_BOM_BASE::OnOkClick ), NULL, this );
|
||||
}
|
||||
|
||||
DIALOG_BUILD_BOM_BASE::~DIALOG_BUILD_BOM_BASE()
|
||||
{
|
||||
// Disconnect Events
|
||||
m_OutputFormCtrl->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_BUILD_BOM_BASE::OnRadioboxSelectFormatSelected ), NULL, this );
|
||||
m_sdbSizerCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_BUILD_BOM_BASE::OnCancelClick ), NULL, this );
|
||||
m_sdbSizerOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_BUILD_BOM_BASE::OnOkClick ), NULL, this );
|
||||
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -1,83 +0,0 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Oct 8 2012)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __DIALOG_BUILD_BOM_BASE_H__
|
||||
#define __DIALOG_BUILD_BOM_BASE_H__
|
||||
|
||||
#include <wx/artprov.h>
|
||||
#include <wx/xrc/xmlres.h>
|
||||
#include <wx/intl.h>
|
||||
class DIALOG_SHIM;
|
||||
|
||||
#include "dialog_shim.h"
|
||||
#include <wx/string.h>
|
||||
#include <wx/checkbox.h>
|
||||
#include <wx/gdicmn.h>
|
||||
#include <wx/font.h>
|
||||
#include <wx/colour.h>
|
||||
#include <wx/settings.h>
|
||||
#include <wx/sizer.h>
|
||||
#include <wx/statbox.h>
|
||||
#include <wx/radiobox.h>
|
||||
#include <wx/statline.h>
|
||||
#include <wx/button.h>
|
||||
#include <wx/dialog.h>
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
/// Class DIALOG_BUILD_BOM_BASE
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
class DIALOG_BUILD_BOM_BASE : public DIALOG_SHIM
|
||||
{
|
||||
private:
|
||||
|
||||
protected:
|
||||
enum
|
||||
{
|
||||
ID_RADIOBOX_SELECT_FORMAT = 1000
|
||||
};
|
||||
|
||||
wxCheckBox* m_ListCmpbyRefItems;
|
||||
wxCheckBox* m_ListSubCmpItems;
|
||||
wxCheckBox* m_ListCmpbyValItems;
|
||||
wxCheckBox* m_GenListLabelsbyVal;
|
||||
wxCheckBox* m_GenListLabelsbySheet;
|
||||
wxRadioBox* m_OutputFormCtrl;
|
||||
wxRadioBox* m_OutputSeparatorCtrl;
|
||||
wxCheckBox* m_GetListBrowser;
|
||||
wxCheckBox* m_AddLocationField;
|
||||
wxCheckBox* m_AddDatasheetField;
|
||||
wxCheckBox* m_AddFootprintField;
|
||||
wxCheckBox* m_AddField1;
|
||||
wxCheckBox* m_AddField2;
|
||||
wxCheckBox* m_AddField3;
|
||||
wxCheckBox* m_AddField4;
|
||||
wxCheckBox* m_AddField5;
|
||||
wxCheckBox* m_AddField6;
|
||||
wxCheckBox* m_AddField7;
|
||||
wxCheckBox* m_AddField8;
|
||||
wxCheckBox* m_AddAllFields;
|
||||
wxStaticLine* m_staticline1;
|
||||
wxStdDialogButtonSizer* m_sdbSizer;
|
||||
wxButton* m_sdbSizerOK;
|
||||
wxButton* m_sdbSizerCancel;
|
||||
|
||||
// Virtual event handlers, overide them in your derived class
|
||||
virtual void OnRadioboxSelectFormatSelected( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnCancelClick( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnOkClick( wxCommandEvent& event ) { event.Skip(); }
|
||||
|
||||
|
||||
public:
|
||||
|
||||
DIALOG_BUILD_BOM_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("List of Materials"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
|
||||
~DIALOG_BUILD_BOM_BASE();
|
||||
|
||||
};
|
||||
|
||||
#endif //__DIALOG_BUILD_BOM_BASE_H__
|
|
@ -1,8 +1,29 @@
|
|||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: dialog_edit_component_in_lib.cpp
|
||||
// Author: jean-pierre Charras
|
||||
// Licence: GPL
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
/**
|
||||
* @file dialog_edit_component_in_lib.cpp
|
||||
*/
|
||||
|
||||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* 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
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include <fctsys.h>
|
||||
#include <common.h>
|
||||
|
@ -11,12 +32,12 @@
|
|||
#include <appl_wxstruct.h>
|
||||
|
||||
#include <general.h>
|
||||
#include <protos.h>
|
||||
#include <libeditframe.h>
|
||||
#include <class_library.h>
|
||||
|
||||
#include <dialog_edit_component_in_lib.h>
|
||||
|
||||
int DIALOG_EDIT_COMPONENT_IN_LIBRARY::m_lastOpenedPage = 0;
|
||||
|
||||
DIALOG_EDIT_COMPONENT_IN_LIBRARY::DIALOG_EDIT_COMPONENT_IN_LIBRARY( LIB_EDIT_FRAME* aParent ):
|
||||
DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE( aParent )
|
||||
|
@ -33,6 +54,7 @@ DIALOG_EDIT_COMPONENT_IN_LIBRARY::DIALOG_EDIT_COMPONENT_IN_LIBRARY( LIB_EDIT_FRA
|
|||
|
||||
DIALOG_EDIT_COMPONENT_IN_LIBRARY::~DIALOG_EDIT_COMPONENT_IN_LIBRARY()
|
||||
{
|
||||
m_lastOpenedPage = m_NoteBook->GetSelection( );
|
||||
}
|
||||
|
||||
/* Initialize state of check boxes and texts
|
||||
|
@ -86,6 +108,8 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::initDlg()
|
|||
m_ButtonDeleteOneFootprintFilter->Enable( false );
|
||||
}
|
||||
|
||||
m_NoteBook->SetSelection( m_lastOpenedPage );
|
||||
|
||||
m_stdSizerButtonOK->SetDefault();
|
||||
}
|
||||
|
||||
|
@ -156,7 +180,6 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::InitBasicPanel()
|
|||
|
||||
void DIALOG_EDIT_COMPONENT_IN_LIBRARY::OnOkClick( wxCommandEvent& event )
|
||||
{
|
||||
|
||||
/* Update the doc, keyword and doc filename strings */
|
||||
int index;
|
||||
LIB_ALIAS* alias;
|
||||
|
|
|
@ -1,8 +1,29 @@
|
|||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: dialog_edit_component_in_lib.h
|
||||
// Author: jean-pierre Charras
|
||||
// Licence: GPL
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
/**
|
||||
* @file dialog_edit_component_in_lib.h
|
||||
*/
|
||||
|
||||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* 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
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _DIALOG_EDIT_COMPONENT_IN_LIB_H_
|
||||
|
@ -13,6 +34,8 @@
|
|||
|
||||
class DIALOG_EDIT_COMPONENT_IN_LIBRARY: public DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE
|
||||
{
|
||||
static int m_lastOpenedPage; // To remember the last notebook selection
|
||||
|
||||
public:
|
||||
LIB_EDIT_FRAME* m_Parent;
|
||||
bool m_RecreateToolbar;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Apr 10 2012)
|
||||
// C++ code generated with wxFormBuilder (version Oct 8 2012)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
|
@ -109,7 +109,7 @@ DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE::DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE( wx
|
|||
m_PanelBasic->SetSizer( bSizerBasicPanel );
|
||||
m_PanelBasic->Layout();
|
||||
bSizerBasicPanel->Fit( m_PanelBasic );
|
||||
m_NoteBook->AddPage( m_PanelBasic, _("Options"), false );
|
||||
m_NoteBook->AddPage( m_PanelBasic, _("Options"), true );
|
||||
m_PanelDoc = new wxPanel( m_NoteBook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER|wxTAB_TRAVERSAL );
|
||||
wxBoxSizer* m_PanelDocBoxSizer;
|
||||
m_PanelDocBoxSizer = new wxBoxSizer( wxVERTICAL );
|
||||
|
@ -121,6 +121,7 @@ DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE::DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE( wx
|
|||
m_PanelDocBoxSizer->Add( m_staticTextDescription, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_DocCtrl = new wxTextCtrl( m_PanelDoc, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_DocCtrl->SetMaxLength( 0 );
|
||||
m_PanelDocBoxSizer->Add( m_DocCtrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_staticTextKeywords = new wxStaticText( m_PanelDoc, wxID_ANY, _("Keywords:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
|
@ -130,6 +131,7 @@ DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE::DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE( wx
|
|||
m_PanelDocBoxSizer->Add( m_staticTextKeywords, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_KeywordsCtrl = new wxTextCtrl( m_PanelDoc, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_KeywordsCtrl->SetMaxLength( 0 );
|
||||
m_PanelDocBoxSizer->Add( m_KeywordsCtrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_staticTextDocFileName = new wxStaticText( m_PanelDoc, wxID_ANY, _("DocFileName:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
|
@ -139,6 +141,7 @@ DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE::DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE( wx
|
|||
m_PanelDocBoxSizer->Add( m_staticTextDocFileName, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_DocfileCtrl = new wxTextCtrl( m_PanelDoc, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 400,-1 ), 0 );
|
||||
m_DocfileCtrl->SetMaxLength( 0 );
|
||||
m_PanelDocBoxSizer->Add( m_DocfileCtrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
wxBoxSizer* bSizerPaneldocbutts;
|
||||
|
@ -157,7 +160,7 @@ DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE::DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE( wx
|
|||
m_PanelDoc->SetSizer( m_PanelDocBoxSizer );
|
||||
m_PanelDoc->Layout();
|
||||
m_PanelDocBoxSizer->Fit( m_PanelDoc );
|
||||
m_NoteBook->AddPage( m_PanelDoc, _("Description"), true );
|
||||
m_NoteBook->AddPage( m_PanelDoc, _("Description"), false );
|
||||
m_PanelAlias = new wxPanel( m_NoteBook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER|wxTAB_TRAVERSAL );
|
||||
wxBoxSizer* bSizerMainPanelAlias;
|
||||
bSizerMainPanelAlias = new wxBoxSizer( wxHORIZONTAL );
|
||||
|
|
|
@ -185,7 +185,7 @@
|
|||
<object class="notebookpage" expanded="1">
|
||||
<property name="bitmap"></property>
|
||||
<property name="label">Options</property>
|
||||
<property name="select">0</property>
|
||||
<property name="select">1</property>
|
||||
<object class="wxPanel" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
|
@ -1348,7 +1348,7 @@
|
|||
<object class="notebookpage" expanded="1">
|
||||
<property name="bitmap"></property>
|
||||
<property name="label">Description</property>
|
||||
<property name="select">1</property>
|
||||
<property name="select">0</property>
|
||||
<object class="wxPanel" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Apr 10 2012)
|
||||
// C++ code generated with wxFormBuilder (version Oct 8 2012)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
|
@ -11,6 +11,8 @@
|
|||
#include <wx/artprov.h>
|
||||
#include <wx/xrc/xmlres.h>
|
||||
#include <wx/intl.h>
|
||||
class DIALOG_SHIM;
|
||||
|
||||
#include "dialog_shim.h"
|
||||
#include <wx/string.h>
|
||||
#include <wx/checkbox.h>
|
||||
|
|
|
@ -40,12 +40,95 @@
|
|||
#include <class_library.h>
|
||||
#include <sch_component.h>
|
||||
#include <dialog_helpers.h>
|
||||
#include <dialog_edit_component_in_schematic_fbp.h>
|
||||
|
||||
#include <dialog_edit_component_in_schematic.h>
|
||||
|
||||
/**
|
||||
* class DIALOG_EDIT_COMPONENT_IN_SCHEMATIC
|
||||
* is hand coded and implements DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP which
|
||||
* is maintained by wxFormBuilder. Do not auto-generate this class or file,
|
||||
* it is hand coded.
|
||||
*/
|
||||
class DIALOG_EDIT_COMPONENT_IN_SCHEMATIC : public DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP
|
||||
{
|
||||
public:
|
||||
/** Constructor */
|
||||
DIALOG_EDIT_COMPONENT_IN_SCHEMATIC( wxWindow* parent );
|
||||
|
||||
/**
|
||||
* Function InitBuffers
|
||||
* sets up to edit the given component.
|
||||
* @param aComponent The component to edit.
|
||||
*/
|
||||
void InitBuffers( SCH_COMPONENT* aComponent );
|
||||
|
||||
private:
|
||||
|
||||
friend class SCH_EDIT_FRAME;
|
||||
|
||||
SCH_EDIT_FRAME* m_Parent;
|
||||
SCH_COMPONENT* m_Cmp;
|
||||
LIB_COMPONENT* m_LibEntry;
|
||||
bool m_skipCopyFromPanel;
|
||||
|
||||
static int s_SelectedRow;
|
||||
|
||||
/// a copy of the edited component's SCH_FIELDs
|
||||
SCH_FIELDS m_FieldsBuf;
|
||||
|
||||
void setSelectedFieldNdx( int aFieldNdx );
|
||||
|
||||
int getSelectedFieldNdx();
|
||||
|
||||
/**
|
||||
* Function copySelectedFieldToPanel
|
||||
* sets the values displayed on the panel according to
|
||||
* the currently selected field row
|
||||
*/
|
||||
void copySelectedFieldToPanel();
|
||||
|
||||
|
||||
/**
|
||||
* Function copyPanelToSelectedField
|
||||
* copies the values displayed on the panel fields to the currently
|
||||
* selected field
|
||||
* @return bool - true if all fields are OK, else false if the user has put
|
||||
* bad data into a field, and this value can be used to deny a row change.
|
||||
*/
|
||||
bool copyPanelToSelectedField();
|
||||
|
||||
void copyOptionsToPanel();
|
||||
|
||||
void copyPanelToOptions();
|
||||
|
||||
void setRowItem( int aFieldNdx, const SCH_FIELD& aField );
|
||||
|
||||
// event handlers
|
||||
void OnListItemDeselected( wxListEvent& event );
|
||||
void OnListItemSelected( wxListEvent& event );
|
||||
void OnCancelButtonClick( wxCommandEvent& event );
|
||||
void OnOKButtonClick( wxCommandEvent& event );
|
||||
void SetInitCmp( wxCommandEvent& event );
|
||||
void addFieldButtonHandler( wxCommandEvent& event );
|
||||
void deleteFieldButtonHandler( wxCommandEvent& event );
|
||||
void moveUpButtonHandler( wxCommandEvent& event );
|
||||
|
||||
SCH_FIELD* findField( const wxString& aFieldName );
|
||||
|
||||
/**
|
||||
* Function updateDisplay
|
||||
* update the listbox showing fields, according to the fields texts
|
||||
* must be called after a text change in fields, if this change is not an edition
|
||||
*/
|
||||
void updateDisplay( )
|
||||
{
|
||||
for( unsigned ii = FIELD1; ii<m_FieldsBuf.size(); ii++ )
|
||||
setRowItem( ii, m_FieldsBuf[ii] );
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
int DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::s_SelectedRow;
|
||||
wxSize DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::s_LastSize = wxDefaultSize;
|
||||
|
||||
|
||||
void SCH_EDIT_FRAME::EditComponent( SCH_COMPONENT* aComponent )
|
||||
|
@ -59,25 +142,11 @@ void SCH_EDIT_FRAME::EditComponent( SCH_COMPONENT* aComponent )
|
|||
|
||||
dlg->InitBuffers( aComponent );
|
||||
|
||||
wxSize sizeNow = dlg->GetSize();
|
||||
|
||||
// this relies on wxDefaultSize being -1,-1, be careful here.
|
||||
if( sizeNow.GetWidth() < DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::s_LastSize.GetWidth()
|
||||
|| sizeNow.GetHeight() < DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::s_LastSize.GetHeight() )
|
||||
{
|
||||
dlg->SetSize( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::s_LastSize );
|
||||
}
|
||||
|
||||
// make sure the chipnameTextCtrl is wide enough to hold any unusually long chip names:
|
||||
EnsureTextCtrlWidth( dlg->chipnameTextCtrl );
|
||||
|
||||
dlg->ShowModal();
|
||||
|
||||
// Some of the field values are long and are not always fully visible because the
|
||||
// window comes up too narrow. Remember user's manual window resizing efforts here
|
||||
// so it comes up wide enough next time.
|
||||
DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::s_LastSize = dlg->GetSize();
|
||||
|
||||
m_canvas->MoveCursorToCrossHair();
|
||||
m_canvas->SetIgnoreMouseEvents( false );
|
||||
dlg->Destroy();
|
||||
|
|
|
@ -1,105 +0,0 @@
|
|||
|
||||
#ifndef __dialog_edit_component_in_schematic__
|
||||
#define __dialog_edit_component_in_schematic__
|
||||
|
||||
|
||||
#include <sch_field.h>
|
||||
#include <template_fieldnames.h>
|
||||
|
||||
#include <dialog_edit_component_in_schematic_fbp.h>
|
||||
|
||||
|
||||
class SCH_EDIT_FRAME;
|
||||
|
||||
|
||||
/**
|
||||
* class DIALOG_EDIT_COMPONENT_IN_SCHEMATIC
|
||||
* is hand coded and implements DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP which
|
||||
* is maintained by wxFormBuilder. Do not auto-generate this class or file,
|
||||
* it is hand coded.
|
||||
*/
|
||||
class DIALOG_EDIT_COMPONENT_IN_SCHEMATIC : public DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP
|
||||
{
|
||||
friend class SCH_EDIT_FRAME;
|
||||
|
||||
SCH_EDIT_FRAME* m_Parent;
|
||||
SCH_COMPONENT* m_Cmp;
|
||||
LIB_COMPONENT* m_LibEntry;
|
||||
bool m_skipCopyFromPanel;
|
||||
|
||||
static int s_SelectedRow;
|
||||
|
||||
/// The size of the dialog window last time it was displayed;
|
||||
static wxSize s_LastSize;
|
||||
|
||||
/// a copy of the edited component's SCH_FIELDs
|
||||
SCH_FIELDS m_FieldsBuf;
|
||||
|
||||
void setSelectedFieldNdx( int aFieldNdx );
|
||||
|
||||
int getSelectedFieldNdx();
|
||||
|
||||
/**
|
||||
* Function copySelectedFieldToPanel
|
||||
* sets the values displayed on the panel according to
|
||||
* the currently selected field row
|
||||
*/
|
||||
void copySelectedFieldToPanel();
|
||||
|
||||
|
||||
/**
|
||||
* Function copyPanelToSelectedField
|
||||
* copies the values displayed on the panel fields to the currently
|
||||
* selected field
|
||||
* @return bool - true if all fields are OK, else false if the user has put
|
||||
* bad data into a field, and this value can be used to deny a row change.
|
||||
*/
|
||||
bool copyPanelToSelectedField();
|
||||
|
||||
void copyOptionsToPanel();
|
||||
|
||||
void copyPanelToOptions();
|
||||
|
||||
void setRowItem( int aFieldNdx, const SCH_FIELD& aField );
|
||||
|
||||
// event handlers
|
||||
void OnListItemDeselected( wxListEvent& event );
|
||||
void OnListItemSelected( wxListEvent& event );
|
||||
void OnCancelButtonClick( wxCommandEvent& event );
|
||||
void OnOKButtonClick( wxCommandEvent& event );
|
||||
void SetInitCmp( wxCommandEvent& event );
|
||||
void addFieldButtonHandler( wxCommandEvent& event );
|
||||
void deleteFieldButtonHandler( wxCommandEvent& event );
|
||||
void moveUpButtonHandler( wxCommandEvent& event );
|
||||
|
||||
SCH_FIELD* findField( const wxString& aFieldName );
|
||||
|
||||
|
||||
protected:
|
||||
|
||||
|
||||
public:
|
||||
/** Constructor */
|
||||
DIALOG_EDIT_COMPONENT_IN_SCHEMATIC( wxWindow* parent );
|
||||
|
||||
/**
|
||||
* Function InitBuffers
|
||||
* sets up to edit the given component.
|
||||
* @param aComponent The component to edit.
|
||||
*/
|
||||
void InitBuffers( SCH_COMPONENT* aComponent );
|
||||
|
||||
private:
|
||||
/**
|
||||
* Function updateDisplay
|
||||
* update the listbox showing fields, according to the fields texts
|
||||
* must be called after a text change in fields, if this change is not an edition
|
||||
*/
|
||||
void updateDisplay( )
|
||||
{
|
||||
for( unsigned ii = FIELD1; ii<m_FieldsBuf.size(); ii++ )
|
||||
setRowItem( ii, m_FieldsBuf[ii] );
|
||||
}
|
||||
};
|
||||
|
||||
#endif // __dialog_edit_component_in_schematic__
|
|
@ -1,5 +1,5 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Oct 8 2012)
|
||||
// C++ code generated with wxFormBuilder (version Apr 30 2013)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
|
@ -9,7 +9,7 @@
|
|||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
|
||||
DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style )
|
||||
{
|
||||
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
|
||||
|
||||
|
|
|
@ -44,7 +44,7 @@
|
|||
<property name="pos"></property>
|
||||
<property name="size">700,496</property>
|
||||
<property name="style">wxCAPTION|wxCLOSE_BOX|wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER|wxSYSTEM_MENU</property>
|
||||
<property name="subclass">; </property>
|
||||
<property name="subclass">DIALOG_SHIM; dialog_shim.h</property>
|
||||
<property name="title">Component Properties</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Oct 8 2012)
|
||||
// C++ code generated with wxFormBuilder (version Apr 30 2013)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
|
@ -11,6 +11,9 @@
|
|||
#include <wx/artprov.h>
|
||||
#include <wx/xrc/xmlres.h>
|
||||
#include <wx/intl.h>
|
||||
class DIALOG_SHIM;
|
||||
|
||||
#include "dialog_shim.h"
|
||||
#include <wx/string.h>
|
||||
#include <wx/stattext.h>
|
||||
#include <wx/gdicmn.h>
|
||||
|
@ -33,7 +36,7 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
/// Class DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
class DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP : public wxDialog
|
||||
class DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP : public DIALOG_SHIM
|
||||
{
|
||||
private:
|
||||
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
#include <appl_wxstruct.h>
|
||||
#include <class_sch_screen.h>
|
||||
#include <wxEeschemaStruct.h>
|
||||
#include <invoke_sch_dialog.h>
|
||||
|
||||
#include <general.h>
|
||||
#include <netlist.h>
|
||||
|
@ -45,6 +46,7 @@
|
|||
#include <dialog_erc.h>
|
||||
#include <dialog_erc_listbox.h>
|
||||
#include <erc.h>
|
||||
#include <id.h>
|
||||
|
||||
|
||||
bool DIALOG_ERC::m_writeErcFile = false;
|
||||
|
@ -57,7 +59,10 @@ END_EVENT_TABLE()
|
|||
|
||||
|
||||
DIALOG_ERC::DIALOG_ERC( SCH_EDIT_FRAME* parent ) :
|
||||
DIALOG_ERC_BASE( parent )
|
||||
DIALOG_ERC_BASE(
|
||||
parent,
|
||||
ID_DIALOG_ERC // parent looks for this ID explicitly
|
||||
)
|
||||
{
|
||||
m_parent = parent;
|
||||
Init();
|
||||
|
@ -564,3 +569,14 @@ void DIALOG_ERC::TestErc( wxArrayString* aMessagesList )
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
wxDialog* InvokeDialogERC( SCH_EDIT_FRAME* aCaller )
|
||||
{
|
||||
// This is a modeless dialog, so new it rather than instantiating on stack.
|
||||
DIALOG_ERC* dlg = new DIALOG_ERC( aCaller );
|
||||
|
||||
dlg->Show( true );
|
||||
|
||||
return dlg; // wxDialog is information hiding about DIALOG_ERC.
|
||||
}
|
||||
|
|
|
@ -1,10 +1,12 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Apr 11 2012)
|
||||
// C++ code generated with wxFormBuilder (version Oct 8 2012)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "wx/bmpcbox.h"
|
||||
|
||||
#include "dialog_lib_edit_pin_base.h"
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
@ -33,6 +35,7 @@ DIALOG_LIB_EDIT_PIN_BASE::DIALOG_LIB_EDIT_PIN_BASE( wxWindow* parent, wxWindowID
|
|||
fgSizerPins->Add( m_staticTextPinName, 0, wxALIGN_CENTER_VERTICAL|wxALL, 3 );
|
||||
|
||||
m_textPinName = new wxTextCtrl( this, ID_M_TEXTPINNAME, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_textPinName->SetMaxLength( 0 );
|
||||
fgSizerPins->Add( m_textPinName, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxBOTTOM, 3 );
|
||||
|
||||
m_staticTextPadName = new wxStaticText( this, ID_M_STATICTEXTPADNAME, _("Pin n&umber:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
|
@ -42,13 +45,14 @@ DIALOG_LIB_EDIT_PIN_BASE::DIALOG_LIB_EDIT_PIN_BASE( wxWindow* parent, wxWindowID
|
|||
fgSizerPins->Add( m_staticTextPadName, 0, wxALIGN_CENTER_VERTICAL|wxALL, 3 );
|
||||
|
||||
m_textPadName = new wxTextCtrl( this, ID_M_TEXTPADNAME, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_textPadName->SetMaxLength( 0 );
|
||||
fgSizerPins->Add( m_textPadName, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxBOTTOM, 3 );
|
||||
|
||||
m_staticTextOrient = new wxStaticText( this, wxID_ANY, _("&Orientation:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticTextOrient->Wrap( -1 );
|
||||
fgSizerPins->Add( m_staticTextOrient, 0, wxALIGN_CENTER_VERTICAL|wxALL, 3 );
|
||||
|
||||
m_choiceOrientation = new wxBitmapComboBox( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
|
||||
m_choiceOrientation = new wxBitmapComboBox( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY );
|
||||
fgSizerPins->Add( m_choiceOrientation, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 );
|
||||
|
||||
m_staticTextEType = new wxStaticText( this, wxID_ANY, _("&Electrical type:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
|
@ -57,14 +61,14 @@ DIALOG_LIB_EDIT_PIN_BASE::DIALOG_LIB_EDIT_PIN_BASE( wxWindow* parent, wxWindowID
|
|||
|
||||
fgSizerPins->Add( m_staticTextEType, 0, wxALIGN_CENTER_VERTICAL|wxALL, 3 );
|
||||
|
||||
m_choiceElectricalType = new wxBitmapComboBox( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
|
||||
m_choiceElectricalType = new wxBitmapComboBox( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY );
|
||||
fgSizerPins->Add( m_choiceElectricalType, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 );
|
||||
|
||||
m_staticTextGstyle = new wxStaticText( this, wxID_ANY, _("Graphic &Style:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticTextGstyle->Wrap( -1 );
|
||||
fgSizerPins->Add( m_staticTextGstyle, 0, wxALIGN_CENTER_VERTICAL|wxALL, 3 );
|
||||
|
||||
m_choiceStyle = new wxBitmapComboBox( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
|
||||
m_choiceStyle = new wxBitmapComboBox( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY );
|
||||
fgSizerPins->Add( m_choiceStyle, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 );
|
||||
|
||||
|
||||
|
@ -115,6 +119,7 @@ DIALOG_LIB_EDIT_PIN_BASE::DIALOG_LIB_EDIT_PIN_BASE( wxWindow* parent, wxWindowID
|
|||
fgSizerTextsSizes->Add( m_staticTextNameSize, 0, wxALIGN_CENTER_VERTICAL|wxALL, 3 );
|
||||
|
||||
m_textPinNameTextSize = new wxTextCtrl( this, ID_M_TEXTPINNAMETEXTSIZE, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_textPinNameTextSize->SetMaxLength( 0 );
|
||||
fgSizerTextsSizes->Add( m_textPinNameTextSize, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxBOTTOM, 3 );
|
||||
|
||||
m_staticNameTextSizeUnits = new wxStaticText( this, ID_M_STATICNAMETEXTSIZEUNITS, _("units"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
|
@ -126,6 +131,7 @@ DIALOG_LIB_EDIT_PIN_BASE::DIALOG_LIB_EDIT_PIN_BASE( wxWindow* parent, wxWindowID
|
|||
fgSizerTextsSizes->Add( m_staticTextPadNameSize, 0, wxALIGN_CENTER_VERTICAL|wxALL, 3 );
|
||||
|
||||
m_textPadNameTextSize = new wxTextCtrl( this, ID_M_TEXTPADNAMETEXTSIZE, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_textPadNameTextSize->SetMaxLength( 0 );
|
||||
fgSizerTextsSizes->Add( m_textPadNameTextSize, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxEXPAND, 3 );
|
||||
|
||||
m_staticNumberTextSizeUnits = new wxStaticText( this, ID_M_STATICNUMBERTEXTSIZEUNITS, _("units"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
|
@ -137,6 +143,7 @@ DIALOG_LIB_EDIT_PIN_BASE::DIALOG_LIB_EDIT_PIN_BASE( wxWindow* parent, wxWindowID
|
|||
fgSizerTextsSizes->Add( m_staticTextPinLen, 0, wxALL, 5 );
|
||||
|
||||
m_textLength = new wxTextCtrl( this, ID_M_TEXTLENGTH, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_textLength->SetMaxLength( 0 );
|
||||
fgSizerTextsSizes->Add( m_textLength, 0, wxTOP|wxBOTTOM|wxEXPAND, 5 );
|
||||
|
||||
m_staticLengthUnits = new wxStaticText( this, ID_M_STATICLENGTHUNITS, _("units"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
|
|
|
@ -607,7 +607,7 @@
|
|||
<property name="selection">-1</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="style">wxCB_READONLY</property>
|
||||
<property name="subclass">wxBitmapComboBox; wx/bmpcbox.h</property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
|
@ -781,7 +781,7 @@
|
|||
<property name="selection">-1</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="style">wxCB_READONLY</property>
|
||||
<property name="subclass">wxBitmapComboBox; wx/bmpcbox.h</property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
|
@ -955,7 +955,7 @@
|
|||
<property name="selection">-1</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="style">wxCB_READONLY</property>
|
||||
<property name="subclass">wxBitmapComboBox; wx/bmpcbox.h</property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Apr 11 2012)
|
||||
// C++ code generated with wxFormBuilder (version Oct 8 2012)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
|
@ -11,7 +11,9 @@
|
|||
#include <wx/artprov.h>
|
||||
#include <wx/xrc/xmlres.h>
|
||||
#include <wx/intl.h>
|
||||
#include "wx/bmpcbox.h"
|
||||
class DIALOG_SHIM;
|
||||
class wxBitmapComboBox;
|
||||
|
||||
#include "dialog_shim.h"
|
||||
#include <wx/string.h>
|
||||
#include <wx/stattext.h>
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2012 Jean-Pierre Charras, jp.charras@wanadoo.fr
|
||||
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
|
||||
* Copyright (C) 2013 Jean-Pierre Charras, jp.charras@wanadoo.fr
|
||||
* Copyright (C) 2013 Wayne Stambaugh <stambaughw@verizon.net>
|
||||
* Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@ -49,13 +49,184 @@
|
|||
#include <protos.h>
|
||||
#include <sch_sheet.h>
|
||||
#include <dialog_helpers.h>
|
||||
#include <dialog_netlist.h>
|
||||
#include <dialogs/annotate_dialog.h>
|
||||
#include <dialogs/dialog_netlist_base.h>
|
||||
#include <wildcards_and_files_ext.h>
|
||||
#include <wildcards_and_files_ext.h>
|
||||
#include <invoke_sch_dialog.h>
|
||||
|
||||
#include <eeschema_id.h>
|
||||
|
||||
|
||||
|
||||
#define CUSTOMPANEL_COUNTMAX 8 // Max number of netlist plugins
|
||||
|
||||
|
||||
/* panel (notebook page) identifiers */
|
||||
enum panel_netlist_index {
|
||||
PANELPCBNEW = 0, /* Handle Netlist format Pcbnew */
|
||||
PANELORCADPCB2, /* Handle Netlist format OracdPcb2 */
|
||||
PANELCADSTAR, /* Handle Netlist format CadStar */
|
||||
PANELSPICE, /* Handle Netlist format Pspice */
|
||||
PANELCUSTOMBASE /* First auxiliary panel (custom netlists).
|
||||
* others use PANELCUSTOMBASE+1, PANELCUSTOMBASE+2.. */
|
||||
};
|
||||
|
||||
|
||||
/* wxPanels for creating the NoteBook pages for each netlist format: */
|
||||
class NETLIST_PAGE_DIALOG : public wxPanel
|
||||
{
|
||||
public:
|
||||
NETLIST_TYPE_ID m_IdNetType;
|
||||
wxCheckBox* m_IsCurrentFormat;
|
||||
wxCheckBox* m_AddSubPrefix;
|
||||
wxTextCtrl* m_CommandStringCtrl;
|
||||
wxTextCtrl* m_TitleStringCtrl;
|
||||
wxButton* m_ButtonCancel;
|
||||
wxBoxSizer* m_LeftBoxSizer;
|
||||
wxBoxSizer* m_RightBoxSizer;
|
||||
wxBoxSizer* m_RightOptionsBoxSizer;
|
||||
wxBoxSizer* m_LowBoxSizer;
|
||||
wxRadioBox* m_NetOption;
|
||||
private:
|
||||
wxString m_pageNetFmtName;
|
||||
|
||||
public:
|
||||
/** Constructor to create a setup page for one netlist format.
|
||||
* Used in Netlist format Dialog box creation
|
||||
* @param parent = wxNotebook * parent
|
||||
* @param title = title (name) of the notebook page
|
||||
* @param id_NetType = netlist type id
|
||||
*/
|
||||
NETLIST_PAGE_DIALOG( wxNotebook* parent, const wxString& title,
|
||||
NETLIST_TYPE_ID id_NetType );
|
||||
~NETLIST_PAGE_DIALOG() { };
|
||||
|
||||
/**
|
||||
* function GetPageNetFmtName
|
||||
* @return the name of the netlist format for this page
|
||||
* This is usually the page label.
|
||||
* For the pcbnew netlist, this is "LegacyPcbnew"
|
||||
* when the "old" format is selected
|
||||
* and "PcbnewAdvanced" when the advanced format (S expr fmt)is selected
|
||||
*/
|
||||
const wxString GetPageNetFmtName();
|
||||
|
||||
void SetPageNetFmtName( const wxString &aName ) { m_pageNetFmtName = aName; }
|
||||
};
|
||||
|
||||
|
||||
/* Dialog frame for creating netlists */
|
||||
class NETLIST_DIALOG : public NETLIST_DIALOG_BASE
|
||||
{
|
||||
public:
|
||||
SCH_EDIT_FRAME* m_Parent;
|
||||
wxString m_NetFmtName;
|
||||
NETLIST_PAGE_DIALOG* m_PanelNetType[4 + CUSTOMPANEL_COUNTMAX];
|
||||
|
||||
private:
|
||||
wxConfig* m_config;
|
||||
|
||||
public:
|
||||
|
||||
// Constructor and destructor
|
||||
NETLIST_DIALOG( SCH_EDIT_FRAME* parent );
|
||||
~NETLIST_DIALOG() { };
|
||||
|
||||
private:
|
||||
void InstallCustomPages();
|
||||
NETLIST_PAGE_DIALOG* AddOneCustomPage( const wxString & aTitle,
|
||||
const wxString & aCommandString,
|
||||
NETLIST_TYPE_ID aNetTypeId );
|
||||
void InstallPageSpice();
|
||||
void GenNetlist( wxCommandEvent& event );
|
||||
void RunSimulator( wxCommandEvent& event );
|
||||
void NetlistUpdateOpt();
|
||||
void OnCancelClick( wxCommandEvent& event );
|
||||
void OnNetlistTypeSelection( wxNotebookEvent& event );
|
||||
void SelectDefaultNetlistType( wxCommandEvent& event );
|
||||
void EnableSubcircuitPrefix( wxCommandEvent& event );
|
||||
|
||||
/**
|
||||
* Function OnAddPlugin
|
||||
* Add a new panel for a new netlist plugin
|
||||
*/
|
||||
void OnAddPlugin( wxCommandEvent& event );
|
||||
|
||||
/**
|
||||
* Function OnDelPlugin
|
||||
* Remove a panel relative to a netlist plugin
|
||||
*/
|
||||
void OnDelPlugin( wxCommandEvent& event );
|
||||
|
||||
/**
|
||||
* Function WriteCurrentNetlistSetup
|
||||
* Write the current netlist options setup in the configuration
|
||||
*/
|
||||
void WriteCurrentNetlistSetup();
|
||||
|
||||
bool GetUseDefaultNetlistName()
|
||||
{
|
||||
return m_cbUseDefaultNetlistName->IsChecked();
|
||||
}
|
||||
|
||||
/**
|
||||
* Function ReturnUserNetlistTypeName
|
||||
* to retrieve user netlist type names
|
||||
* @param first_item = true: return first name of the list, false = return next
|
||||
* @return a wxString : name of the type netlist or empty string
|
||||
* this function must be called first with "first_item" = true
|
||||
* and after with "first_item" = false to get all the other existing netlist names
|
||||
*/
|
||||
const wxString ReturnUserNetlistTypeName( bool first_item );
|
||||
|
||||
/**
|
||||
* Function ReturnFilenamePrms
|
||||
* returns the filename extension and the wildcard string for this curr
|
||||
* or a void name if there is no default name
|
||||
* @param aNetTypeId = the netlist type ( NET_TYPE_PCBNEW ... )
|
||||
* @param aExt = a reference to a wxString to return the default file ext.
|
||||
* @param aWildCard = reference to a wxString to return the default wildcard.
|
||||
* @return true for known netlist type, false for custom formats
|
||||
*/
|
||||
bool ReturnFilenamePrms( NETLIST_TYPE_ID aNetTypeId,
|
||||
wxString * aExt, wxString * aWildCard );
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
|
||||
class NETLIST_DIALOG_ADD_PLUGIN : public NETLIST_DIALOG_ADD_PLUGIN_BASE
|
||||
{
|
||||
private:
|
||||
NETLIST_DIALOG* m_Parent;
|
||||
|
||||
public:
|
||||
NETLIST_DIALOG_ADD_PLUGIN( NETLIST_DIALOG* parent );
|
||||
const wxString GetPluginTitle()
|
||||
{
|
||||
return m_textCtrlName->GetValue();
|
||||
}
|
||||
const wxString GetPluginTCommandLine()
|
||||
{
|
||||
return m_textCtrlCommand->GetValue();
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
/**
|
||||
* Function OnOKClick
|
||||
* Validate info relative to a new netlist plugin
|
||||
*/
|
||||
void OnOKClick( wxCommandEvent& event );
|
||||
void OnCancelClick( wxCommandEvent& event );
|
||||
|
||||
/*
|
||||
* Browse plugin files, and set m_CommandStringCtrl field
|
||||
*/
|
||||
void OnBrowsePlugins( wxCommandEvent& event );
|
||||
};
|
||||
|
||||
|
||||
/* Event id for notebook page buttons: */
|
||||
enum id_netlist {
|
||||
ID_CREATE_NETLIST = ID_END_EESCHEMA_ID_LIST + 1,
|
||||
|
@ -87,14 +258,7 @@ BEGIN_EVENT_TABLE( NETLIST_DIALOG, NETLIST_DIALOG_BASE )
|
|||
END_EVENT_TABLE()
|
||||
|
||||
|
||||
/*******************************/
|
||||
/* Functions for these classes */
|
||||
/*******************************/
|
||||
|
||||
|
||||
/* Contructor to create a setup page for one netlist format.
|
||||
* Used in Netlist format Dialog box creation
|
||||
*/
|
||||
NETLIST_PAGE_DIALOG::NETLIST_PAGE_DIALOG( wxNotebook* parent,
|
||||
const wxString& title,
|
||||
NETLIST_TYPE_ID id_NetType ) :
|
||||
|
@ -164,6 +328,7 @@ NETLIST_PAGE_DIALOG::NETLIST_PAGE_DIALOG( wxNotebook* parent,
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
const wxString NETLIST_PAGE_DIALOG::GetPageNetFmtName()
|
||||
{
|
||||
// PCBNEW Format is a special type:
|
||||
|
@ -224,14 +389,6 @@ NETLIST_DIALOG::NETLIST_DIALOG( SCH_EDIT_FRAME* parent ) :
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* Function ReturnUserNetlistTypeName
|
||||
* to retrieve user netlist type names
|
||||
* @param first_item = true: return first name of the list, false = return next
|
||||
* @return a wxString : name of the type netlist or empty string
|
||||
* this function must be called first with "first_item" = true
|
||||
* and after with "first_item" = false to get all the other existing netlist names
|
||||
*/
|
||||
const wxString NETLIST_DIALOG::ReturnUserNetlistTypeName( bool first_item )
|
||||
{
|
||||
static int index;
|
||||
|
@ -250,6 +407,7 @@ const wxString NETLIST_DIALOG::ReturnUserNetlistTypeName( bool first_item )
|
|||
return name;
|
||||
}
|
||||
|
||||
|
||||
void NETLIST_DIALOG::InstallPageSpice()
|
||||
{
|
||||
wxButton* Button;
|
||||
|
@ -283,8 +441,6 @@ void NETLIST_DIALOG::InstallPageSpice()
|
|||
}
|
||||
|
||||
|
||||
/* create the pages for custom netlist format selection:
|
||||
*/
|
||||
void NETLIST_DIALOG::InstallCustomPages()
|
||||
{
|
||||
int ii;
|
||||
|
@ -309,6 +465,7 @@ void NETLIST_DIALOG::InstallCustomPages()
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
NETLIST_PAGE_DIALOG* NETLIST_DIALOG::AddOneCustomPage( const wxString & aTitle,
|
||||
const wxString & aCommandString,
|
||||
NETLIST_TYPE_ID aNetTypeId )
|
||||
|
@ -347,8 +504,6 @@ NETLIST_PAGE_DIALOG* NETLIST_DIALOG::AddOneCustomPage( const wxString & aTitle,
|
|||
}
|
||||
|
||||
|
||||
/* Called when the check box "default format" is clicked
|
||||
*/
|
||||
void NETLIST_DIALOG::SelectDefaultNetlistType( wxCommandEvent& event )
|
||||
{
|
||||
int ii;
|
||||
|
@ -367,10 +522,7 @@ void NETLIST_DIALOG::SelectDefaultNetlistType( wxCommandEvent& event )
|
|||
currPage->m_IsCurrentFormat->SetValue( true );
|
||||
}
|
||||
|
||||
/* Called when a netlist type is selected.
|
||||
* Enable/disable relevant/irrelevant widgets, and display the default
|
||||
* netlist name, for known types
|
||||
*/
|
||||
|
||||
void NETLIST_DIALOG::OnNetlistTypeSelection( wxNotebookEvent& event )
|
||||
{
|
||||
NETLIST_PAGE_DIALOG* currPage = (NETLIST_PAGE_DIALOG*) m_NoteBook->GetCurrentPage();
|
||||
|
@ -391,10 +543,7 @@ void NETLIST_DIALOG::OnNetlistTypeSelection( wxNotebookEvent& event )
|
|||
m_textCtrlDefaultFileName->Clear();
|
||||
}
|
||||
|
||||
/* Called when the check box m_AddSubPrefix
|
||||
* "default format" is clicked
|
||||
* ( Spice format only )
|
||||
*/
|
||||
|
||||
void NETLIST_DIALOG::EnableSubcircuitPrefix( wxCommandEvent& event )
|
||||
{
|
||||
|
||||
|
@ -408,6 +557,7 @@ void NETLIST_DIALOG::EnableSubcircuitPrefix( wxCommandEvent& event )
|
|||
m_Parent->SetAddReferencePrefix( currPage->m_AddSubPrefix->IsChecked() );
|
||||
}
|
||||
|
||||
|
||||
void NETLIST_DIALOG::NetlistUpdateOpt()
|
||||
{
|
||||
int ii;
|
||||
|
@ -426,12 +576,6 @@ void NETLIST_DIALOG::NetlistUpdateOpt()
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* Function GenNetlist
|
||||
* Create the netlist file:
|
||||
* calculate the filename with the suitable extensions
|
||||
* and run the netlist creator
|
||||
*/
|
||||
void NETLIST_DIALOG::GenNetlist( wxCommandEvent& event )
|
||||
{
|
||||
wxFileName fn;
|
||||
|
@ -446,7 +590,7 @@ void NETLIST_DIALOG::GenNetlist( wxCommandEvent& event )
|
|||
|
||||
unsigned netlist_opt = 0;
|
||||
|
||||
/* Calculate the netlist filename */
|
||||
// Calculate the netlist filename
|
||||
fn = g_RootSheet->GetScreen()->GetFileName();
|
||||
ReturnFilenamePrms( currPage->m_IdNetType, &fileExt, &fileWildcard );
|
||||
|
||||
|
@ -479,18 +623,20 @@ void NETLIST_DIALOG::GenNetlist( wxCommandEvent& event )
|
|||
if( fn.GetPath().IsEmpty() )
|
||||
fn.SetPath( wxGetCwd() );
|
||||
|
||||
wxString fullfilename = fn.GetFullPath();
|
||||
wxString fullpath = fn.GetFullPath();
|
||||
|
||||
if( !GetUseDefaultNetlistName() || currPage->m_IdNetType >= NET_TYPE_CUSTOM1 )
|
||||
{
|
||||
wxFileDialog dlg( this, title, fn.GetPath(),
|
||||
fullfilename, fileWildcard,
|
||||
wxFD_SAVE );
|
||||
wxString fullname = fn.GetFullName();
|
||||
wxString path = fn.GetPath();
|
||||
|
||||
// fullname does not and should not include the path, per wx docs.
|
||||
wxFileDialog dlg( this, title, path, fullname, fileWildcard, wxFD_SAVE );
|
||||
|
||||
if( dlg.ShowModal() == wxID_CANCEL )
|
||||
return;
|
||||
|
||||
fullfilename = dlg.GetPath();
|
||||
fullpath = dlg.GetPath(); // directory + filename
|
||||
}
|
||||
|
||||
m_Parent->ClearMsgPanel();
|
||||
|
@ -500,22 +646,14 @@ void NETLIST_DIALOG::GenNetlist( wxCommandEvent& event )
|
|||
else
|
||||
m_Parent->SetNetListerCommand( wxEmptyString );
|
||||
|
||||
m_Parent->CreateNetlist( currPage->m_IdNetType, fullfilename, netlist_opt );
|
||||
m_Parent->CreateNetlist( currPage->m_IdNetType, fullpath, netlist_opt );
|
||||
|
||||
WriteCurrentNetlistSetup();
|
||||
|
||||
EndModal( wxID_OK );
|
||||
}
|
||||
|
||||
/**
|
||||
* Function ReturnFilenamePrms
|
||||
* returns the filename extension and the wildcard string for this curr
|
||||
* or a void name if there is no default name
|
||||
* @param aNetTypeId = the netlist type ( NET_TYPE_PCBNEW ... )
|
||||
* @param aExt = a reference to a wxString to return the default file ext.
|
||||
* @param aWildCard = reference to a wxString to return the default wildcard.
|
||||
* @return true for known netlist type, false for custom formats
|
||||
*/
|
||||
|
||||
bool NETLIST_DIALOG::ReturnFilenamePrms( NETLIST_TYPE_ID aNetTypeId,
|
||||
wxString * aExt, wxString * aWildCard )
|
||||
{
|
||||
|
@ -556,15 +694,7 @@ bool NETLIST_DIALOG::ReturnFilenamePrms( NETLIST_TYPE_ID aNetTypeId,
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* Function CreateNetlist
|
||||
* > test for some issues (missing or duplicate references and sheet names)
|
||||
* > build netlist info
|
||||
* > create the netlist file
|
||||
* param aFormat = netlist format (NET_TYPE_PCBNEW ...)
|
||||
* param aFullFileName = full netlist file name
|
||||
* param aNetlistOptions = netlist options using OR'ed bits (see WriteNetListFile).
|
||||
* return true if success.
|
||||
*/
|
||||
|
||||
bool SCH_EDIT_FRAME::CreateNetlist( int aFormat, const wxString& aFullFileName,
|
||||
unsigned aNetlistOptions )
|
||||
{
|
||||
|
@ -593,7 +723,7 @@ Do you want to annotate schematic?" ) ) )
|
|||
return false;
|
||||
}
|
||||
|
||||
/* Cleanup the entire hierarchy */
|
||||
// Cleanup the entire hierarchy
|
||||
SCH_SCREENS screens;
|
||||
screens.SchematicCleanUp();
|
||||
|
||||
|
@ -622,7 +752,7 @@ void NETLIST_DIALOG::RunSimulator( wxCommandEvent& event )
|
|||
ExecFile = tmp.BeforeFirst( ' ' );
|
||||
CommandLine = tmp.AfterFirst( ' ' );
|
||||
|
||||
/* Calculate the netlist filename */
|
||||
// Calculate the netlist filename
|
||||
fn = g_RootSheet->GetScreen()->GetFileName();
|
||||
fn.SetExt( wxT( "cir" ) );
|
||||
CommandLine += wxT( " \"" ) + fn.GetFullPath() + wxT( "\"" );
|
||||
|
@ -644,11 +774,7 @@ void NETLIST_DIALOG::RunSimulator( wxCommandEvent& event )
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* Function WriteCurrentNetlistSetup
|
||||
* Write the current netlist options setup in the configuration
|
||||
*/
|
||||
void NETLIST_DIALOG::WriteCurrentNetlistSetup( void )
|
||||
void NETLIST_DIALOG::WriteCurrentNetlistSetup()
|
||||
{
|
||||
wxString msg, Command;
|
||||
|
||||
|
@ -656,7 +782,8 @@ void NETLIST_DIALOG::WriteCurrentNetlistSetup( void )
|
|||
|
||||
m_config->Write( NETLIST_USE_DEFAULT_NETNAME, GetUseDefaultNetlistName() );
|
||||
|
||||
// Update the new titles
|
||||
// Update existing custom pages
|
||||
int jj = 0;
|
||||
for( int ii = 0; ii < CUSTOMPANEL_COUNTMAX; ii++ )
|
||||
{
|
||||
NETLIST_PAGE_DIALOG* currPage = m_PanelNetType[ii + PANELCUSTOMBASE];
|
||||
|
@ -664,37 +791,36 @@ void NETLIST_DIALOG::WriteCurrentNetlistSetup( void )
|
|||
if( currPage == NULL )
|
||||
break;
|
||||
|
||||
msg = wxT( "Custom" );
|
||||
msg << ii + 1;
|
||||
wxString title = currPage->m_TitleStringCtrl->GetValue();
|
||||
|
||||
if( currPage->m_TitleStringCtrl )
|
||||
{
|
||||
wxString title = currPage->m_TitleStringCtrl->GetValue();
|
||||
currPage->SetPageNetFmtName( title );
|
||||
if( title.IsEmpty() )
|
||||
continue;
|
||||
|
||||
if( msg != title ) // Title has changed, Update config
|
||||
{
|
||||
msg = CUSTOM_NETLIST_TITLE;
|
||||
msg << ii + 1;
|
||||
m_config->Write( msg, title );
|
||||
}
|
||||
}
|
||||
msg = CUSTOM_NETLIST_TITLE;
|
||||
msg << jj + 1;
|
||||
m_config->Write( msg, title );
|
||||
|
||||
if( currPage->m_CommandStringCtrl )
|
||||
{
|
||||
Command = currPage->m_CommandStringCtrl->GetValue();
|
||||
msg = CUSTOM_NETLIST_COMMAND;
|
||||
msg << ii + 1;
|
||||
m_config->Write( msg, Command );
|
||||
}
|
||||
Command = currPage->m_CommandStringCtrl->GetValue();
|
||||
msg = CUSTOM_NETLIST_COMMAND;
|
||||
msg << jj + 1;
|
||||
m_config->Write( msg, Command );
|
||||
jj++;
|
||||
}
|
||||
|
||||
// Ensure all other pages are void
|
||||
for(; jj < CUSTOMPANEL_COUNTMAX; jj++ )
|
||||
{
|
||||
msg = CUSTOM_NETLIST_TITLE;
|
||||
msg << jj + 1;
|
||||
m_config->Write( msg, wxEmptyString );
|
||||
|
||||
msg = CUSTOM_NETLIST_COMMAND;
|
||||
msg << jj + 1;
|
||||
m_config->Write( msg, wxEmptyString );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Function OnDelPlugin
|
||||
* Remove a panel relative to a netlist plugin
|
||||
*/
|
||||
void NETLIST_DIALOG::OnDelPlugin( wxCommandEvent& event )
|
||||
{
|
||||
NETLIST_PAGE_DIALOG* currPage = (NETLIST_PAGE_DIALOG*) m_NoteBook->GetCurrentPage();
|
||||
|
@ -712,10 +838,7 @@ void NETLIST_DIALOG::OnDelPlugin( wxCommandEvent& event )
|
|||
EndModal( NET_PLUGIN_CHANGE );
|
||||
}
|
||||
|
||||
/**
|
||||
* Function OnAddPlugin
|
||||
* Add a new panel for a new netlist plugin
|
||||
*/
|
||||
|
||||
void NETLIST_DIALOG::OnAddPlugin( wxCommandEvent& event )
|
||||
{
|
||||
NETLIST_DIALOG_ADD_PLUGIN dlg( this );
|
||||
|
@ -760,10 +883,7 @@ NETLIST_DIALOG_ADD_PLUGIN::NETLIST_DIALOG_ADD_PLUGIN( NETLIST_DIALOG* parent ) :
|
|||
GetSizer()->SetSizeHints( this );
|
||||
}
|
||||
|
||||
/**
|
||||
* Function OnOKClick
|
||||
* Validate info relative to a new netlist plugin
|
||||
*/
|
||||
|
||||
void NETLIST_DIALOG_ADD_PLUGIN::OnOKClick( wxCommandEvent& event )
|
||||
{
|
||||
if( m_textCtrlCommand->GetValue() == wxEmptyString )
|
||||
|
@ -781,14 +901,13 @@ void NETLIST_DIALOG_ADD_PLUGIN::OnOKClick( wxCommandEvent& event )
|
|||
EndModal( wxID_OK );
|
||||
}
|
||||
|
||||
|
||||
void NETLIST_DIALOG_ADD_PLUGIN::OnCancelClick( wxCommandEvent& event )
|
||||
{
|
||||
EndModal( wxID_CANCEL );
|
||||
}
|
||||
|
||||
/*
|
||||
* Browse plugin files, and set m_CommandStringCtrl field
|
||||
*/
|
||||
|
||||
void NETLIST_DIALOG_ADD_PLUGIN::OnBrowsePlugins( wxCommandEvent& event )
|
||||
{
|
||||
wxString FullFileName, Mask, Path;
|
||||
|
@ -807,8 +926,9 @@ void NETLIST_DIALOG_ADD_PLUGIN::OnBrowsePlugins( wxCommandEvent& event )
|
|||
if( FullFileName.IsEmpty() )
|
||||
return;
|
||||
|
||||
// Creates a default command line, suitable for external tool xslproc:
|
||||
// Creates a default command line, suitable for external tool xslproc or python
|
||||
// try to build a default command line depending on plugin extension
|
||||
// "xsl" or "exe" or "py"
|
||||
wxString cmdLine;
|
||||
wxFileName fn( FullFileName );
|
||||
wxString ext = fn.GetExt();
|
||||
|
@ -817,6 +937,8 @@ void NETLIST_DIALOG_ADD_PLUGIN::OnBrowsePlugins( wxCommandEvent& event )
|
|||
cmdLine.Printf(wxT("xsltproc -o \"%%O\" \"%s\" \"%%I\""), GetChars(FullFileName) );
|
||||
else if( ext == wxT("exe" ) || ext.IsEmpty() )
|
||||
cmdLine.Printf(wxT("\"%s\" > \"%%O\" < \"%%I\""), GetChars(FullFileName) );
|
||||
else if( ext == wxT("py" ) || ext.IsEmpty() )
|
||||
cmdLine.Printf(wxT("python \"%s\" \"%%I\" \"%%O\""), GetChars(FullFileName) );
|
||||
else
|
||||
cmdLine.Printf(wxT("\"%s\""), GetChars(FullFileName) );
|
||||
|
||||
|
@ -828,3 +950,12 @@ void NETLIST_DIALOG_ADD_PLUGIN::OnBrowsePlugins( wxCommandEvent& event )
|
|||
if( title.IsEmpty() )
|
||||
wxMessageBox( _( "Do not forget to choose a title for this netlist control page" ) );
|
||||
}
|
||||
|
||||
|
||||
int InvokeDialogNetList( SCH_EDIT_FRAME* aCaller )
|
||||
{
|
||||
NETLIST_DIALOG dlg( aCaller );
|
||||
|
||||
return dlg.ShowModal();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,205 +0,0 @@
|
|||
/**
|
||||
* @file eeschema/dialogs/dialog_netlist.h
|
||||
*/
|
||||
|
||||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2012 Jean-Pierre Charras, jp.charras@wanadoo.fr
|
||||
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
|
||||
* Copyright (C) 1992-2012 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
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#ifndef _DIALOG_NETLIST_H_
|
||||
#define _DIALOG_NETLIST_H_
|
||||
|
||||
#include <dialogs/dialog_netlist_base.h>
|
||||
|
||||
#define CUSTOMPANEL_COUNTMAX 8 // Max number of netlist plugins
|
||||
|
||||
// Id to select netlist type
|
||||
enum NETLIST_TYPE_ID {
|
||||
NET_TYPE_UNINIT = 0,
|
||||
NET_TYPE_PCBNEW,
|
||||
NET_TYPE_ORCADPCB2,
|
||||
NET_TYPE_CADSTAR,
|
||||
NET_TYPE_SPICE,
|
||||
NET_TYPE_CUSTOM1, /* NET_TYPE_CUSTOM1
|
||||
* is the first id for user netlist format
|
||||
* NET_TYPE_CUSTOM1+CUSTOMPANEL_COUNTMAX-1
|
||||
* is the last id for user netlist format
|
||||
*/
|
||||
NET_TYPE_CUSTOM_MAX = NET_TYPE_CUSTOM1 + CUSTOMPANEL_COUNTMAX - 1
|
||||
};
|
||||
|
||||
/* panel (notebook page) identifiers */
|
||||
enum panel_netlist_index {
|
||||
PANELPCBNEW = 0, /* Handle Netlist format Pcbnew */
|
||||
PANELORCADPCB2, /* Handle Netlist format OracdPcb2 */
|
||||
PANELCADSTAR, /* Handle Netlist format CadStar */
|
||||
PANELSPICE, /* Handle Netlist format Pspice */
|
||||
PANELCUSTOMBASE /* First auxiliary panel (custom netlists).
|
||||
* others use PANELCUSTOMBASE+1, PANELCUSTOMBASE+2.. */
|
||||
};
|
||||
|
||||
// Values returned when the netlist dialog is dismissed
|
||||
#define NET_PLUGIN_CHANGE 1
|
||||
// other values in use are wxID_OK and wxID_CANCEL
|
||||
|
||||
|
||||
|
||||
/* wxPanels for creating the NoteBook pages for each netlist format: */
|
||||
class NETLIST_PAGE_DIALOG : public wxPanel
|
||||
{
|
||||
public:
|
||||
NETLIST_TYPE_ID m_IdNetType;
|
||||
wxCheckBox* m_IsCurrentFormat;
|
||||
wxCheckBox* m_AddSubPrefix;
|
||||
wxTextCtrl* m_CommandStringCtrl;
|
||||
wxTextCtrl* m_TitleStringCtrl;
|
||||
wxButton* m_ButtonCancel;
|
||||
wxBoxSizer* m_LeftBoxSizer;
|
||||
wxBoxSizer* m_RightBoxSizer;
|
||||
wxBoxSizer* m_RightOptionsBoxSizer;
|
||||
wxBoxSizer* m_LowBoxSizer;
|
||||
wxRadioBox* m_NetOption;
|
||||
private:
|
||||
wxString m_pageNetFmtName;
|
||||
|
||||
public:
|
||||
/** Constructor to create a setup page for one netlist format.
|
||||
* Used in Netlist format Dialog box creation
|
||||
* @param parent = wxNotebook * parent
|
||||
* @param title = title (name) of the notebook page
|
||||
* @param id_NetType = netlist type id
|
||||
*/
|
||||
NETLIST_PAGE_DIALOG( wxNotebook* parent, const wxString& title,
|
||||
NETLIST_TYPE_ID id_NetType );
|
||||
~NETLIST_PAGE_DIALOG() { };
|
||||
|
||||
/**
|
||||
* function GetPageNetFmtName
|
||||
* @return the name of the netlist format for this page
|
||||
* This is usually the page label.
|
||||
* For the pcbnew netlist, this is "LegacyPcbnew"
|
||||
* when the "old" format is selected
|
||||
* and "PcbnewAdvanced" when the advanced format (S expr fmt)is selected
|
||||
*/
|
||||
const wxString GetPageNetFmtName();
|
||||
|
||||
void SetPageNetFmtName( const wxString &aName ) { m_pageNetFmtName = aName; }
|
||||
};
|
||||
|
||||
|
||||
// Options for Spice netlist generation (OR'ed bits
|
||||
enum netlistOptions {
|
||||
NET_USE_X_PREFIX = 2, // for Spice netlist : change "U" and "IC" reference prefix to "X"
|
||||
NET_PCBNEW_USE_NEW_FORMAT = 1, // For Pcbnew use the new format (S expression and SWEET)
|
||||
};
|
||||
|
||||
/* Dialog frame for creating netlists */
|
||||
class NETLIST_DIALOG : public NETLIST_DIALOG_BASE
|
||||
{
|
||||
public:
|
||||
SCH_EDIT_FRAME* m_Parent;
|
||||
wxString m_NetFmtName;
|
||||
NETLIST_PAGE_DIALOG* m_PanelNetType[4 + CUSTOMPANEL_COUNTMAX];
|
||||
|
||||
private:
|
||||
wxConfig* m_config;
|
||||
|
||||
public:
|
||||
|
||||
// Constructor and destructor
|
||||
NETLIST_DIALOG( SCH_EDIT_FRAME* parent );
|
||||
~NETLIST_DIALOG() { };
|
||||
|
||||
private:
|
||||
void InstallCustomPages();
|
||||
NETLIST_PAGE_DIALOG* AddOneCustomPage( const wxString & aTitle,
|
||||
const wxString & aCommandString,
|
||||
NETLIST_TYPE_ID aNetTypeId );
|
||||
void InstallPageSpice();
|
||||
void GenNetlist( wxCommandEvent& event );
|
||||
void RunSimulator( wxCommandEvent& event );
|
||||
void NetlistUpdateOpt();
|
||||
void OnCancelClick( wxCommandEvent& event );
|
||||
void OnNetlistTypeSelection( wxNotebookEvent& event );
|
||||
void SelectDefaultNetlistType( wxCommandEvent& event );
|
||||
void EnableSubcircuitPrefix( wxCommandEvent& event );
|
||||
void OnAddPlugin( wxCommandEvent& event );
|
||||
void OnDelPlugin( wxCommandEvent& event );
|
||||
|
||||
void WriteCurrentNetlistSetup( void );
|
||||
|
||||
bool GetUseDefaultNetlistName()
|
||||
{
|
||||
return m_cbUseDefaultNetlistName->IsChecked();
|
||||
}
|
||||
|
||||
/**
|
||||
* Function ReturnUserNetlistTypeName
|
||||
* to retrieve user netlist type names
|
||||
* @param first_item = true: return first name of the list, false = return next
|
||||
* @return a wxString : name of the type netlist or empty string
|
||||
* this function must be called first with "first_item" = true
|
||||
* and after with "first_item" = false to get all the other existing netlist names
|
||||
*/
|
||||
const wxString ReturnUserNetlistTypeName( bool first_item );
|
||||
|
||||
/**
|
||||
* Function ReturnFilenamePrms
|
||||
* returns the filename extension and the wildcard string for this curr
|
||||
* or a void name if there is no default name
|
||||
* @param aNetTypeId = the netlist type ( NET_TYPE_PCBNEW ... )
|
||||
* @param aExt = a reference to a wxString to return the default file ext.
|
||||
* @param aWildCard = reference to a wxString to return the default wildcard.
|
||||
* @return true for known netlist type, false for custom formats
|
||||
*/
|
||||
bool ReturnFilenamePrms( NETLIST_TYPE_ID aNetTypeId,
|
||||
wxString * aExt, wxString * aWildCard );
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
|
||||
class NETLIST_DIALOG_ADD_PLUGIN : public NETLIST_DIALOG_ADD_PLUGIN_BASE
|
||||
{
|
||||
private:
|
||||
NETLIST_DIALOG* m_Parent;
|
||||
|
||||
public:
|
||||
NETLIST_DIALOG_ADD_PLUGIN( NETLIST_DIALOG* parent );
|
||||
const wxString GetPluginTitle()
|
||||
{
|
||||
return m_textCtrlName->GetValue();
|
||||
}
|
||||
const wxString GetPluginTCommandLine()
|
||||
{
|
||||
return m_textCtrlCommand->GetValue();
|
||||
}
|
||||
|
||||
private:
|
||||
void OnOKClick( wxCommandEvent& event );
|
||||
void OnCancelClick( wxCommandEvent& event );
|
||||
void OnBrowsePlugins( wxCommandEvent& event );
|
||||
};
|
||||
|
||||
#endif /* _DIALOG_NETLIST_H_ */
|
|
@ -16,7 +16,35 @@
|
|||
#include <sch_sheet.h>
|
||||
#include <sch_sheet_path.h>
|
||||
|
||||
#include <dialog_print_using_printer.h>
|
||||
#include <invoke_sch_dialog.h>
|
||||
#include <dialog_print_using_printer_base.h>
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Class DIALOG_PRINT_USING_PRINTER
|
||||
* offers to print a schematic dialog.
|
||||
*
|
||||
* Derived from DIALOG_PRINT_USING_PRINTER_base created by wxFormBuilder
|
||||
*/
|
||||
class DIALOG_PRINT_USING_PRINTER : public DIALOG_PRINT_USING_PRINTER_BASE
|
||||
{
|
||||
public:
|
||||
DIALOG_PRINT_USING_PRINTER( SCH_EDIT_FRAME* aParent );
|
||||
|
||||
SCH_EDIT_FRAME* GetParent() const;
|
||||
|
||||
private:
|
||||
void OnCloseWindow( wxCloseEvent& event );
|
||||
void OnInitDialog( wxInitDialogEvent& event );
|
||||
void OnPageSetup( wxCommandEvent& event );
|
||||
void OnPrintPreview( wxCommandEvent& event );
|
||||
void OnPrintButtonClick( wxCommandEvent& event );
|
||||
void OnButtonCancelClick( wxCommandEvent& event ){ Close(); }
|
||||
|
||||
void GetPrintOptions();
|
||||
};
|
||||
|
||||
|
||||
|
||||
/**
|
||||
|
@ -415,3 +443,11 @@ void SCH_PRINTOUT::DrawPage( SCH_SCREEN* aScreen )
|
|||
aScreen->m_DrawOrg = old_org;
|
||||
aScreen->SetZoom( oldZoom );
|
||||
}
|
||||
|
||||
|
||||
int InvokeDialogPrintUsingPrinter( SCH_EDIT_FRAME* aCaller )
|
||||
{
|
||||
DIALOG_PRINT_USING_PRINTER dlg( aCaller );
|
||||
|
||||
return dlg.ShowModal();
|
||||
}
|
||||
|
|
|
@ -1,34 +0,0 @@
|
|||
|
||||
#ifndef _DIALOG_PRINT_USING_PRINTER_H_
|
||||
#define _DIALOG_PRINT_USING_PRINTER_H_
|
||||
|
||||
|
||||
#include <dialog_print_using_printer_base.h>
|
||||
|
||||
|
||||
/**
|
||||
* Print schematic dialog.
|
||||
*
|
||||
* Class derived from DIALOG_PRINT_USING_PRINTER_base created by wxFormBuilder
|
||||
*/
|
||||
class DIALOG_PRINT_USING_PRINTER : public DIALOG_PRINT_USING_PRINTER_BASE
|
||||
{
|
||||
public:
|
||||
DIALOG_PRINT_USING_PRINTER( SCH_EDIT_FRAME* aParent );
|
||||
~DIALOG_PRINT_USING_PRINTER() {};
|
||||
|
||||
SCH_EDIT_FRAME* GetParent() const;
|
||||
|
||||
private:
|
||||
void OnCloseWindow( wxCloseEvent& event );
|
||||
void OnInitDialog( wxInitDialogEvent& event );
|
||||
void OnPageSetup( wxCommandEvent& event );
|
||||
void OnPrintPreview( wxCommandEvent& event );
|
||||
void OnPrintButtonClick( wxCommandEvent& event );
|
||||
void OnButtonCancelClick( wxCommandEvent& event ){ Close(); }
|
||||
|
||||
void GetPrintOptions();
|
||||
};
|
||||
|
||||
|
||||
#endif // _DIALOG_PRINT_USING_PRINTER_H_
|
|
@ -161,10 +161,12 @@ bool EDA_APP::OnInit()
|
|||
|
||||
frame->Zoom_Automatique( true );
|
||||
|
||||
/* Load file specified in the command line. */
|
||||
// Load file specified in the command line:
|
||||
if( fileReady )
|
||||
{
|
||||
wxSetWorkingDirectory( filename.GetPath() );
|
||||
if( !filename.GetPath().IsEmpty() )
|
||||
// wxSetWorkingDirectory does not like empty paths
|
||||
wxSetWorkingDirectory( filename.GetPath() );
|
||||
|
||||
if( frame->LoadOneEEProject( filename.GetFullPath(), false ) )
|
||||
frame->GetCanvas()->Refresh( true );
|
||||
|
|
|
@ -0,0 +1,79 @@
|
|||
|
||||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2013 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
|
||||
* Copyright (C) 2013 KiCad Developers, see change_log.txt for contributors.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
// This header is an insolation layer between top most frames and any number of
|
||||
// DIALOG classes which can be called from a frame window.
|
||||
// It is a place to put invocation functions for [modal] dialogs, with benefits:
|
||||
//
|
||||
// 1) The information about each dialog class is not exposed to the frame.
|
||||
// So therefore the DIALOG class can often be kept out of a header file entirely.
|
||||
//
|
||||
// 2) The information about the calling frame is not necessarily exposed to
|
||||
// to the called dialog class, at least not in here.
|
||||
|
||||
// The actual InvokeDialog<class>() function is usually coded at the bottom of the
|
||||
// DIALOG_<class>.cpp file.
|
||||
|
||||
|
||||
#ifndef INVOKE_SCH_DIALOG_H_
|
||||
#define INVOKE_SCH_DIALOG_H_
|
||||
|
||||
|
||||
class wxFrame;
|
||||
class wxDialog;
|
||||
|
||||
// Often this is not used in the prototypes, since wxFrame is good enough and would
|
||||
// represent maximum information hiding.
|
||||
class SCH_EDIT_FRAME;
|
||||
|
||||
|
||||
/// Create and show DIALOG_ANNOTATE and return whatever
|
||||
/// DIALOG_ANNOTATE::ShowModal() returns.
|
||||
int InvokeDialogAnnotate( SCH_EDIT_FRAME* aCaller );
|
||||
|
||||
/// Create the modeless DIALOG_ERC and show it, return something to
|
||||
/// destroy or close it. The dialog will have ID_DIALOG_ERC from id.h
|
||||
wxDialog* InvokeDialogERC( SCH_EDIT_FRAME* aCaller );
|
||||
|
||||
/// Create and show DIALOG_PRINT_USING_PRINTER and return whatever
|
||||
/// DIALOG_PRINT_USING_PRINTER::ShowModal() returns.
|
||||
int InvokeDialogPrintUsingPrinter( SCH_EDIT_FRAME* aCaller );
|
||||
|
||||
/// Create and show DIALOG_BOM and return whatever
|
||||
/// DIALOG_BOM::ShowModal() returns.
|
||||
int InvokeDialogCreateBOM( SCH_EDIT_FRAME* aCaller );
|
||||
|
||||
/**
|
||||
* Function InvokeDialogNetList
|
||||
* creates and shows NETLIST_DIALOG and returns whatever
|
||||
* NETLIST_DIALOG::ShowModal() returns.
|
||||
* @param int - NET_PLUGIN_CHANGE means user added or deleted a plugin,
|
||||
* wxID_OK, or wxID_CANCEL.
|
||||
*/
|
||||
#define NET_PLUGIN_CHANGE 1
|
||||
int InvokeDialogNetList( SCH_EDIT_FRAME* aCaller );
|
||||
|
||||
|
||||
#endif // INVOKE_SCH_DIALOG_H_
|
|
@ -304,7 +304,8 @@ void LIB_FIELD::drawGraphic( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& a
|
|||
text = m_Text;
|
||||
|
||||
GRSetDrawMode( aDC, aDrawMode );
|
||||
DrawGraphicText( aPanel, aDC, text_pos, (EDA_COLOR_T) color, text, m_Orient, m_Size,
|
||||
EDA_RECT* clipbox = aPanel? aPanel->GetClipBox() : NULL;
|
||||
DrawGraphicText( clipbox, aDC, text_pos, (EDA_COLOR_T) color, text, m_Orient, m_Size,
|
||||
m_HJustify, m_VJustify, linewidth, m_Italic, m_Bold );
|
||||
|
||||
/* Set to one (1) to draw bounding box around field text to validate
|
||||
|
@ -315,7 +316,7 @@ void LIB_FIELD::drawGraphic( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& a
|
|||
grBox.SetOrigin( aTransform.TransformCoordinate( bBox.GetOrigin() ) );
|
||||
grBox.SetEnd( aTransform.TransformCoordinate( bBox.GetEnd() ) );
|
||||
grBox.Move( aOffset );
|
||||
GRRect( aPanel->GetClipBox(), aDC, grBox, 0, LIGHTMAGENTA );
|
||||
GRRect( clipbox, aDC, grBox, 0, LIGHTMAGENTA );
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -311,7 +311,8 @@ void LIB_PIN::SetOrientation( int orientation )
|
|||
|
||||
for( size_t i = 0; i < pinList.size(); i++ )
|
||||
{
|
||||
if( ( pinList[i]->m_Flags & IS_LINKED ) == 0 || pinList[i]->m_orientation == orientation )
|
||||
if( ( pinList[i]->m_Flags & IS_LINKED ) == 0 ||
|
||||
pinList[i]->m_orientation == orientation )
|
||||
continue;
|
||||
|
||||
pinList[i]->m_orientation = orientation;
|
||||
|
@ -349,6 +350,12 @@ void LIB_PIN::SetShape( int aShape )
|
|||
|
||||
void LIB_PIN::SetType( int aType )
|
||||
{
|
||||
if( aType < 0 )
|
||||
aType = 0;
|
||||
|
||||
if( aType >= (int)PIN_ELECTRICAL_TYPE_CNT )
|
||||
aType = PIN_ELECTRICAL_TYPE_CNT - 1;
|
||||
|
||||
if( m_type != aType )
|
||||
{
|
||||
m_type = aType;
|
||||
|
@ -1084,6 +1091,7 @@ void LIB_PIN::DrawPinTexts( EDA_DRAW_PANEL* panel,
|
|||
numLineWidth = Clamp_Text_PenSize( numLineWidth, m_numTextSize, false );
|
||||
|
||||
GRSetDrawMode( DC, DrawMode );
|
||||
EDA_RECT* clipbox = panel? panel->GetClipBox() : NULL;
|
||||
|
||||
/* Get the num and name colors */
|
||||
if( (Color < 0) && IsSelected() )
|
||||
|
@ -1132,7 +1140,7 @@ void LIB_PIN::DrawPinTexts( EDA_DRAW_PANEL* panel,
|
|||
if( orient == PIN_RIGHT )
|
||||
{
|
||||
x = x1 + TextInside;
|
||||
DrawGraphicText( panel, DC, wxPoint( x, y1 ), NameColor,
|
||||
DrawGraphicText( clipbox, DC, wxPoint( x, y1 ), NameColor,
|
||||
m_name,
|
||||
TEXT_ORIENT_HORIZ,
|
||||
PinNameSize,
|
||||
|
@ -1143,7 +1151,7 @@ void LIB_PIN::DrawPinTexts( EDA_DRAW_PANEL* panel,
|
|||
else // Orient == PIN_LEFT
|
||||
{
|
||||
x = x1 - TextInside;
|
||||
DrawGraphicText( panel, DC, wxPoint( x, y1 ), NameColor,
|
||||
DrawGraphicText( clipbox, DC, wxPoint( x, y1 ), NameColor,
|
||||
m_name,
|
||||
TEXT_ORIENT_HORIZ,
|
||||
PinNameSize,
|
||||
|
@ -1155,7 +1163,7 @@ void LIB_PIN::DrawPinTexts( EDA_DRAW_PANEL* panel,
|
|||
|
||||
if( DrawPinNum )
|
||||
{
|
||||
DrawGraphicText( panel, DC,
|
||||
DrawGraphicText( clipbox, DC,
|
||||
wxPoint( (x1 + pin_pos.x) / 2,
|
||||
y1 - TXTMARGE ), NumColor,
|
||||
StringPinNum,
|
||||
|
@ -1173,7 +1181,7 @@ void LIB_PIN::DrawPinTexts( EDA_DRAW_PANEL* panel,
|
|||
y = y1 + TextInside;
|
||||
|
||||
if( DrawPinName )
|
||||
DrawGraphicText( panel, DC, wxPoint( x1, y ), NameColor,
|
||||
DrawGraphicText( clipbox, DC, wxPoint( x1, y ), NameColor,
|
||||
m_name,
|
||||
TEXT_ORIENT_VERT, PinNameSize,
|
||||
GR_TEXT_HJUSTIFY_RIGHT,
|
||||
|
@ -1181,7 +1189,7 @@ void LIB_PIN::DrawPinTexts( EDA_DRAW_PANEL* panel,
|
|||
false, false );
|
||||
|
||||
if( DrawPinNum )
|
||||
DrawGraphicText( panel, DC,
|
||||
DrawGraphicText( clipbox, DC,
|
||||
wxPoint( x1 - TXTMARGE,
|
||||
(y1 + pin_pos.y) / 2 ), NumColor,
|
||||
StringPinNum,
|
||||
|
@ -1195,7 +1203,7 @@ void LIB_PIN::DrawPinTexts( EDA_DRAW_PANEL* panel,
|
|||
y = y1 - TextInside;
|
||||
|
||||
if( DrawPinName )
|
||||
DrawGraphicText( panel, DC, wxPoint( x1, y ), NameColor,
|
||||
DrawGraphicText( clipbox, DC, wxPoint( x1, y ), NameColor,
|
||||
m_name,
|
||||
TEXT_ORIENT_VERT, PinNameSize,
|
||||
GR_TEXT_HJUSTIFY_LEFT,
|
||||
|
@ -1203,7 +1211,7 @@ void LIB_PIN::DrawPinTexts( EDA_DRAW_PANEL* panel,
|
|||
false, false );
|
||||
|
||||
if( DrawPinNum )
|
||||
DrawGraphicText( panel, DC,
|
||||
DrawGraphicText( clipbox, DC,
|
||||
wxPoint( x1 - TXTMARGE,
|
||||
(y1 + pin_pos.y) / 2 ), NumColor,
|
||||
StringPinNum,
|
||||
|
@ -1222,7 +1230,7 @@ void LIB_PIN::DrawPinTexts( EDA_DRAW_PANEL* panel,
|
|||
if( DrawPinName )
|
||||
{
|
||||
x = (x1 + pin_pos.x) / 2;
|
||||
DrawGraphicText( panel, DC, wxPoint( x, y1 - TXTMARGE ),
|
||||
DrawGraphicText( clipbox, DC, wxPoint( x, y1 - TXTMARGE ),
|
||||
NameColor, m_name,
|
||||
TEXT_ORIENT_HORIZ, PinNameSize,
|
||||
GR_TEXT_HJUSTIFY_CENTER,
|
||||
|
@ -1232,7 +1240,7 @@ void LIB_PIN::DrawPinTexts( EDA_DRAW_PANEL* panel,
|
|||
if( DrawPinNum )
|
||||
{
|
||||
x = (x1 + pin_pos.x) / 2;
|
||||
DrawGraphicText( panel, DC, wxPoint( x, y1 + TXTMARGE ),
|
||||
DrawGraphicText( clipbox, DC, wxPoint( x, y1 + TXTMARGE ),
|
||||
NumColor, StringPinNum,
|
||||
TEXT_ORIENT_HORIZ, PinNumSize,
|
||||
GR_TEXT_HJUSTIFY_CENTER,
|
||||
|
@ -1245,7 +1253,7 @@ void LIB_PIN::DrawPinTexts( EDA_DRAW_PANEL* panel,
|
|||
if( DrawPinName )
|
||||
{
|
||||
y = (y1 + pin_pos.y) / 2;
|
||||
DrawGraphicText( panel, DC, wxPoint( x1 - TXTMARGE, y ),
|
||||
DrawGraphicText( clipbox, DC, wxPoint( x1 - TXTMARGE, y ),
|
||||
NameColor, m_name,
|
||||
TEXT_ORIENT_VERT, PinNameSize,
|
||||
GR_TEXT_HJUSTIFY_CENTER,
|
||||
|
@ -1255,7 +1263,7 @@ void LIB_PIN::DrawPinTexts( EDA_DRAW_PANEL* panel,
|
|||
|
||||
if( DrawPinNum )
|
||||
{
|
||||
DrawGraphicText( panel, DC,
|
||||
DrawGraphicText( clipbox, DC,
|
||||
wxPoint( x1 + TXTMARGE, (y1 + pin_pos.y) / 2 ),
|
||||
NumColor, StringPinNum,
|
||||
TEXT_ORIENT_VERT, PinNumSize,
|
||||
|
|
|
@ -399,7 +399,8 @@ void LIB_TEXT::drawGraphic( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aO
|
|||
// Calculate pos accordint to mirror/rotation.
|
||||
txtpos = aTransform.TransformCoordinate( txtpos ) + aOffset;
|
||||
|
||||
DrawGraphicText( aPanel, aDC, txtpos, (EDA_COLOR_T) color, m_Text, orient, m_Size,
|
||||
EDA_RECT* clipbox = aPanel? aPanel->GetClipBox() : NULL;
|
||||
DrawGraphicText( clipbox, aDC, txtpos, (EDA_COLOR_T) color, m_Text, orient, m_Size,
|
||||
GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER, GetPenSize(),
|
||||
m_Italic, m_Bold );
|
||||
|
||||
|
@ -412,7 +413,7 @@ void LIB_TEXT::drawGraphic( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aO
|
|||
grBox.SetOrigin( aTransform.TransformCoordinate( bBox.GetOrigin() ) );
|
||||
grBox.SetEnd( aTransform.TransformCoordinate( bBox.GetEnd() ) );
|
||||
grBox.Move( aOffset );
|
||||
GRRect( aPanel->GetClipBox(), aDC, grBox, 0, LIGHTMAGENTA );
|
||||
GRRect( clipbox, aDC, grBox, 0, LIGHTMAGENTA );
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -468,9 +468,9 @@ void LIB_EDIT_FRAME::UpdatePartSelectList()
|
|||
{
|
||||
for( int i = 0; i < m_component->GetPartCount(); i++ )
|
||||
{
|
||||
wxString msg = LIB_COMPONENT::ReturnSubReference( i+1, false );
|
||||
msg.Printf( _( "Part %s" ), GetChars( msg ) );
|
||||
m_partSelectBox->Append( msg );
|
||||
wxString sub = LIB_COMPONENT::ReturnSubReference( i+1, false );
|
||||
wxString part = wxString::Format( _( "Part %s" ), GetChars( sub ) );
|
||||
m_partSelectBox->Append( part );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -37,7 +37,6 @@
|
|||
|
||||
#include <general.h>
|
||||
#include <netlist.h>
|
||||
#include <dialog_netlist.h>
|
||||
#include <class_library.h>
|
||||
#include <lib_pin.h>
|
||||
#include <sch_component.h>
|
||||
|
|
|
@ -39,6 +39,29 @@
|
|||
#include <sch_component.h>
|
||||
|
||||
|
||||
/// netlist types
|
||||
enum NETLIST_TYPE_ID {
|
||||
NET_TYPE_UNINIT = 0,
|
||||
NET_TYPE_PCBNEW,
|
||||
NET_TYPE_ORCADPCB2,
|
||||
NET_TYPE_CADSTAR,
|
||||
NET_TYPE_SPICE,
|
||||
NET_TYPE_CUSTOM1, /* NET_TYPE_CUSTOM1
|
||||
* is the first id for user netlist format
|
||||
* NET_TYPE_CUSTOM1+CUSTOMPANEL_COUNTMAX-1
|
||||
* is the last id for user netlist format
|
||||
*/
|
||||
//NET_TYPE_CUSTOM_MAX = NET_TYPE_CUSTOM1 + CUSTOMPANEL_COUNTMAX - 1
|
||||
};
|
||||
|
||||
|
||||
/// Options for Spice netlist generation (OR'ed bits
|
||||
enum netlistOptions {
|
||||
NET_USE_X_PREFIX = 2, // for Spice netlist : change "U" and "IC" reference prefix to "X"
|
||||
NET_PCBNEW_USE_NEW_FORMAT = 1, // For Pcbnew use the new format (S expression and SWEET)
|
||||
};
|
||||
|
||||
|
||||
class SCH_COMPONENT;
|
||||
class SCH_REFERENC_LIST;
|
||||
|
||||
|
@ -46,7 +69,7 @@ class SCH_REFERENC_LIST;
|
|||
#define NETLIST_HEAD_STRING "EESchema Netlist Version 1.1"
|
||||
|
||||
// Max pin number per component and footprint
|
||||
#define MAXPIN 5000
|
||||
#define MAXPIN 5000
|
||||
|
||||
|
||||
/**
|
||||
|
@ -374,26 +397,6 @@ public:
|
|||
sort( componentFlatList.begin(), componentFlatList.end(), sortByRefAndValue );
|
||||
}
|
||||
|
||||
/**
|
||||
* Function SortByValueAndRef
|
||||
* sorts the list of references by value.
|
||||
* <p>
|
||||
* Components are sorted in the following order:
|
||||
* <ul>
|
||||
* <li>Value of component.</li>
|
||||
* <li>Numeric value of reference designator.</li>
|
||||
* <li>Unit number when component has multiple parts.</li>
|
||||
* <li>Sheet number.</li>
|
||||
* <li>X coordinate position.</li>
|
||||
* <li>Y coordinate position.</li>
|
||||
* </ul>
|
||||
* </p>
|
||||
*/
|
||||
void SortByValueAndRef()
|
||||
{
|
||||
sort( componentFlatList.begin(), componentFlatList.end(), sortByValueAndRef );
|
||||
}
|
||||
|
||||
/**
|
||||
* Function SortByReferenceOnly
|
||||
* sorts the list of references by reference.
|
||||
|
@ -410,25 +413,6 @@ public:
|
|||
sort( componentFlatList.begin(), componentFlatList.end(), sortByReferenceOnly );
|
||||
}
|
||||
|
||||
/**
|
||||
* Function SortByValueOnly
|
||||
* sort the list of references by value.
|
||||
* <p>
|
||||
* Components are grouped by type and are sorted in the following order:
|
||||
* <ul>
|
||||
* <li>Value of component.</li>
|
||||
* <li>Numeric value of reference designator.</li>
|
||||
* <li>Unit number when component has multiple parts.</li>
|
||||
* </ul>
|
||||
* </p>
|
||||
* groups are made by the first letter of reference
|
||||
* or the 2 first letters when existing
|
||||
*/
|
||||
void SortByValueOnly()
|
||||
{
|
||||
sort( componentFlatList.begin(), componentFlatList.end(), sortByValueOnly );
|
||||
}
|
||||
|
||||
/**
|
||||
* Function GetUnit
|
||||
* searches the sorted list of components for a another component with the same
|
||||
|
@ -474,16 +458,12 @@ private:
|
|||
|
||||
static bool sortByRefAndValue( const SCH_REFERENCE& item1, const SCH_REFERENCE& item2 );
|
||||
|
||||
static bool sortByValueAndRef( const SCH_REFERENCE& item1, const SCH_REFERENCE& item2 );
|
||||
|
||||
static bool sortByXPosition( const SCH_REFERENCE& item1, const SCH_REFERENCE& item2 );
|
||||
|
||||
static bool sortByYPosition( const SCH_REFERENCE& item1, const SCH_REFERENCE& item2 );
|
||||
|
||||
static bool sortByTimeStamp( const SCH_REFERENCE& item1, const SCH_REFERENCE& item2 );
|
||||
|
||||
static bool sortByValueOnly( const SCH_REFERENCE& item1, const SCH_REFERENCE& item2 );
|
||||
|
||||
static bool sortByReferenceOnly( const SCH_REFERENCE& item1, const SCH_REFERENCE& item2 );
|
||||
|
||||
/**
|
||||
|
|
|
@ -132,11 +132,6 @@ bool DIALOG_PLOT_SCHEMATIC::plotOneSheetPS( const wxString& aFileName,
|
|||
double aScale,
|
||||
bool aPlotFrameRef )
|
||||
{
|
||||
FILE* output_file = wxFopen( aFileName, wxT( "wt" ) );
|
||||
|
||||
if( output_file == NULL )
|
||||
return false;
|
||||
|
||||
PS_PLOTTER* plotter = new PS_PLOTTER();
|
||||
plotter->SetPageSettings( aPageInfo );
|
||||
plotter->SetDefaultLineWidth( GetDefaultLineThickness() );
|
||||
|
|
|
@ -249,6 +249,11 @@ void SCH_COMPONENT::SetUnit( int aUnit )
|
|||
}
|
||||
}
|
||||
|
||||
void SCH_COMPONENT::UpdateUnit( int aUnit )
|
||||
{
|
||||
m_unit = aUnit;
|
||||
}
|
||||
|
||||
|
||||
void SCH_COMPONENT::SetConvert( int aConvert )
|
||||
{
|
||||
|
|
|
@ -130,8 +130,23 @@ public:
|
|||
|
||||
int GetUnit() const { return m_unit; }
|
||||
|
||||
/**
|
||||
* change the unit id to aUnit
|
||||
* has maening only for multiple parts per package
|
||||
* Also set the modified flag bit
|
||||
* @param aUnit = the new unit Id
|
||||
*/
|
||||
void SetUnit( int aUnit );
|
||||
|
||||
/**
|
||||
* change the unit id to aUnit
|
||||
* has maening only for multiple parts per package
|
||||
* Do not change the modified flag bit, and should be used when
|
||||
* change is not due to an edition command
|
||||
* @param aUnit = the new unit Id
|
||||
*/
|
||||
void UpdateUnit( int aUnit );
|
||||
|
||||
int GetConvert() const { return m_convert; }
|
||||
|
||||
void SetConvert( int aConvert );
|
||||
|
|
|
@ -194,7 +194,8 @@ void SCH_FIELD::Draw( EDA_DRAW_PANEL* panel, wxDC* DC,
|
|||
color = GetLayerColor( LAYER_FIELDS );
|
||||
}
|
||||
|
||||
DrawGraphicText( panel, DC, textpos, color, GetFullyQualifiedText(), orient, m_Size,
|
||||
EDA_RECT* clipbox = panel? panel->GetClipBox() : NULL;
|
||||
DrawGraphicText( clipbox, DC, textpos, color, GetFullyQualifiedText(), orient, m_Size,
|
||||
GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER,
|
||||
LineWidth, m_Italic, m_Bold );
|
||||
|
||||
|
@ -214,9 +215,9 @@ void SCH_FIELD::Draw( EDA_DRAW_PANEL* panel, wxDC* DC,
|
|||
textpos = parentComponent->GetScreenCoord( textpos );
|
||||
textpos += parentComponent->GetPosition();
|
||||
const int len = 10;
|
||||
GRLine( panel->GetClipBox(), DC,
|
||||
GRLine( clipbox, DC,
|
||||
textpos.x - len, textpos.y, textpos.x + len, textpos.y, 0, BLUE );
|
||||
GRLine( panel->GetClipBox(), DC,
|
||||
GRLine( clipbox, DC,
|
||||
textpos.x, textpos.y - len, textpos.x, textpos.y + len, 0, BLUE );
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -734,6 +734,11 @@ void SCH_SCREEN::ClearAnnotation( SCH_SHEET_PATH* aSheetPath )
|
|||
SCH_COMPONENT* component = (SCH_COMPONENT*) item;
|
||||
|
||||
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,
|
||||
// when an edition is finished:
|
||||
component->ClearFlags();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -573,6 +573,7 @@ void SCH_SHEET::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC,
|
|||
wxPoint pos_sheetname,pos_filename;
|
||||
wxPoint pos = m_pos + aOffset;
|
||||
int lineWidth = GetPenSize();
|
||||
EDA_RECT* clipbox = aPanel? aPanel->GetClipBox() : NULL;
|
||||
|
||||
if( aColor >= 0 )
|
||||
color = aColor;
|
||||
|
@ -581,7 +582,7 @@ void SCH_SHEET::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC,
|
|||
|
||||
GRSetDrawMode( aDC, aDrawMode );
|
||||
|
||||
GRRect( aPanel->GetClipBox(), aDC, pos.x, pos.y,
|
||||
GRRect( clipbox, aDC, pos.x, pos.y,
|
||||
pos.x + m_size.x, pos.y + m_size.y, lineWidth, color );
|
||||
|
||||
pos_sheetname = GetSheetNamePosition() + aOffset;
|
||||
|
@ -599,7 +600,7 @@ void SCH_SHEET::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC,
|
|||
txtcolor = GetLayerColor( LAYER_SHEETNAME );
|
||||
|
||||
Text = wxT( "Sheet: " ) + m_name;
|
||||
DrawGraphicText( aPanel, aDC, pos_sheetname,
|
||||
DrawGraphicText( clipbox, aDC, pos_sheetname,
|
||||
(EDA_COLOR_T) txtcolor, Text, name_orientation,
|
||||
wxSize( m_sheetNameSize, m_sheetNameSize ),
|
||||
GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_BOTTOM, lineWidth,
|
||||
|
@ -612,7 +613,7 @@ void SCH_SHEET::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC,
|
|||
txtcolor = GetLayerColor( LAYER_SHEETFILENAME );
|
||||
|
||||
Text = wxT( "File: " ) + m_fileName;
|
||||
DrawGraphicText( aPanel, aDC, pos_filename,
|
||||
DrawGraphicText( clipbox, aDC, pos_filename,
|
||||
(EDA_COLOR_T) txtcolor, Text, name_orientation,
|
||||
wxSize( m_fileNameSize, m_fileNameSize ),
|
||||
GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_TOP, lineWidth,
|
||||
|
|
|
@ -234,7 +234,7 @@ void SCH_SHEET_PATH::UpdateAllScreenReferences()
|
|||
{
|
||||
SCH_COMPONENT* component = (SCH_COMPONENT*) t;
|
||||
component->GetField( REFERENCE )->SetText( component->GetRef( this ) );
|
||||
component->SetUnit( component->GetUnitSelection( this ) );
|
||||
component->UpdateUnit( component->GetUnitSelection( this ) );
|
||||
}
|
||||
|
||||
t = t->Next();
|
||||
|
|
|
@ -343,6 +343,7 @@ void SCH_TEXT::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, const wxPoint& aOffset,
|
|||
{
|
||||
EDA_COLOR_T color;
|
||||
int linewidth = ( m_Thickness == 0 ) ? GetDefaultLineThickness() : m_Thickness;
|
||||
EDA_RECT* clipbox = panel? panel->GetClipBox() : NULL;
|
||||
|
||||
linewidth = Clamp_Text_PenSize( linewidth, m_Size, m_Bold );
|
||||
|
||||
|
@ -355,7 +356,7 @@ void SCH_TEXT::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, const wxPoint& aOffset,
|
|||
|
||||
wxPoint text_offset = aOffset + GetSchematicTextOffset();
|
||||
EXCHG( linewidth, m_Thickness ); // Set the minimum width
|
||||
EDA_TEXT::Draw( panel, DC, text_offset, color, DrawMode, FILLED, UNSPECIFIED_COLOR );
|
||||
EDA_TEXT::Draw( clipbox, DC, text_offset, color, DrawMode, FILLED, UNSPECIFIED_COLOR );
|
||||
EXCHG( linewidth, m_Thickness ); // set initial value
|
||||
|
||||
if( m_isDangling )
|
||||
|
@ -365,7 +366,7 @@ void SCH_TEXT::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, const wxPoint& aOffset,
|
|||
#if 0
|
||||
{
|
||||
EDA_RECT BoundaryBox = GetBoundingBox();
|
||||
GRRect( panel->GetClipBox(), DC, BoundaryBox, 0, BROWN );
|
||||
GRRect( clipbox, DC, BoundaryBox, 0, BROWN );
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
@ -1285,11 +1286,12 @@ void SCH_GLOBALLABEL::Draw( EDA_DRAW_PANEL* panel,
|
|||
int linewidth = (m_Thickness == 0) ? GetDefaultLineThickness() : m_Thickness;
|
||||
linewidth = Clamp_Text_PenSize( linewidth, m_Size, m_Bold );
|
||||
EXCHG( linewidth, m_Thickness ); // Set the minimum width
|
||||
EDA_TEXT::Draw( panel, DC, text_offset, color, DrawMode, FILLED, UNSPECIFIED_COLOR );
|
||||
EDA_RECT* clipbox = panel? panel->GetClipBox() : NULL;
|
||||
EDA_TEXT::Draw( clipbox, DC, text_offset, color, DrawMode, FILLED, UNSPECIFIED_COLOR );
|
||||
EXCHG( linewidth, m_Thickness ); // set initial value
|
||||
|
||||
CreateGraphicShape( Poly, m_Pos + aOffset );
|
||||
GRPoly( panel->GetClipBox(), DC, Poly.size(), &Poly[0], 0, linewidth, color, color );
|
||||
GRPoly( clipbox, DC, Poly.size(), &Poly[0], 0, linewidth, color, color );
|
||||
|
||||
if( m_isDangling )
|
||||
DrawDanglingSymbol( panel, DC, m_Pos + aOffset, color );
|
||||
|
@ -1298,7 +1300,7 @@ void SCH_GLOBALLABEL::Draw( EDA_DRAW_PANEL* panel,
|
|||
#if 0
|
||||
{
|
||||
EDA_RECT BoundaryBox = GetBoundingBox();
|
||||
GRRect( panel->GetClipBox(), DC, BoundaryBox, 0, BROWN );
|
||||
GRRect( clipbox, DC, BoundaryBox, 0, BROWN );
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
@ -1604,7 +1606,9 @@ void SCH_HIERLABEL::Draw( EDA_DRAW_PANEL* panel,
|
|||
{
|
||||
static std::vector <wxPoint> Poly;
|
||||
EDA_COLOR_T color;
|
||||
int linewidth = ( m_Thickness == 0 ) ? GetDefaultLineThickness() : m_Thickness;
|
||||
int linewidth = m_Thickness == 0 ?
|
||||
GetDefaultLineThickness() : m_Thickness;
|
||||
EDA_RECT* clipbox = panel? panel->GetClipBox() : NULL;
|
||||
|
||||
linewidth = Clamp_Text_PenSize( linewidth, m_Size, m_Bold );
|
||||
|
||||
|
@ -1617,11 +1621,11 @@ void SCH_HIERLABEL::Draw( EDA_DRAW_PANEL* panel,
|
|||
|
||||
EXCHG( linewidth, m_Thickness ); // Set the minimum width
|
||||
wxPoint text_offset = offset + GetSchematicTextOffset();
|
||||
EDA_TEXT::Draw( panel, DC, text_offset, color, DrawMode, FILLED, UNSPECIFIED_COLOR );
|
||||
EDA_TEXT::Draw( clipbox, DC, text_offset, color, DrawMode, FILLED, UNSPECIFIED_COLOR );
|
||||
EXCHG( linewidth, m_Thickness ); // set initial value
|
||||
|
||||
CreateGraphicShape( Poly, m_Pos + offset );
|
||||
GRPoly( panel->GetClipBox(), DC, Poly.size(), &Poly[0], 0, linewidth, color, color );
|
||||
GRPoly( clipbox, DC, Poly.size(), &Poly[0], 0, linewidth, color, color );
|
||||
|
||||
if( m_isDangling )
|
||||
DrawDanglingSymbol( panel, DC, m_Pos + offset, color );
|
||||
|
@ -1630,7 +1634,7 @@ void SCH_HIERLABEL::Draw( EDA_DRAW_PANEL* panel,
|
|||
#if 0
|
||||
{
|
||||
EDA_RECT BoundaryBox = GetBoundingBox();
|
||||
GRRect( panel->GetClipBox(), DC, BoundaryBox, 0, BROWN );
|
||||
GRRect( clipbox, DC, BoundaryBox, 0, BROWN );
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue