/TreeMaker

A cross-platform program for origami design based on circle/river packing.

Primary LanguageC++OtherNOASSERTION

/*******************************************************************************
TreeMaker 5.0

A Program for Origami Design

Contact:
  web: http://www.langorigami.com/treemaker/treemaker.php4
  email: treemaker@langorigami.com
  
Developers:
  Robert J. Lang (lead)
  Carlos Furuti (Linux port)
  Wlodzimierz 'ABX' Skiba (MSW port)
  
Special thanks:
  The wxWidgets Team
  Stefan Csomer (wxMac guru)
  Will Naylor and Bill Chapman (authors of wnlib)

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 (in a file called LICENSE.txt); if not, go to
http://www.gnu.org/copyleft/gpl.html or write to 

  Free Software Foundation, Inc.
  59 Temple Place - Suite 330
  Boston, MA 02111-1307 USA

Source code to this program is always available; for more information visit my
website at:

  http://www.langorigami.com

/*******************************************************************************
Information for Programmers

TreeMaker consists of several projects that can be built individually or
together. Source code and headers for all projects is contained within the
Source directory. TreeMaker can be built as a model-only library or as the
full application with GUI. All the code to build the model is in the included
files. However, you will need to download and build the wxWidgets libraries
(www.wxwidgets.org) in order to build the TreeMaker application with GUI.

Source contains the following subdirectories:

Source/tmModel contains the complete TreeMaker mathematical model, no GUI code. 
It does not require wxWidgets.

Source/tmwxGUI contains the TreeMaker GUI code, which is built on top of
wxWidgets.

Source/test contains some test files that allow you to compile and test 
portions of the TreeMaker model. Most of them do not require wxWidgets.

Source/images contains images (like the splash screen).

The file tmHeader.h is a required prefix headers for all code and can be
precompiled using tmPrec.cpp. File tmHeader.cpp contains the implementation of
assertion and log code common to all files.

********************************************************************************
To build TreeMaker:

Detailed build instructions for Macintosh, Linux, and Windows are given within
the platform-specific directories (mac, linux, and msw, respectively). Your
best (and easiest) bet is to use one of the build systems we've already set up.
But if you're using a different build system or building TreeMaker for a
different platform, the overall process is the following.

Download and build wxWidgets from www.wxWidgets.org, version 2.6.2 or higher.

Configure the libraries with the following options:

--enable-std_iostreams --enable-std_string

If you are building wxMac, you will also need 

--with-mac --disable-shared --enable-monolithic 

If you are building wxGTK and have GNOME installed, you should use

--with-gnomeprint

which will give improved printing and improved ability to convert printouts to
PDF.

and if you are building debug versions of the app (on any platform), you will
need

--enable-debug

See the wxWidgets home page (www.wxwidgets.org) for more details on building
wxWidgets or see the platform-specific README files for more information.

Once you've built the wxWidgets libraries, create a new wxWidgets project and
add the TreeMaker source code to it. How you do this depends on what
development environment you are using (e.g., makefiles vs. IDE).

Whatever you use, you will need to pass some preprocessor symbols to the
compiler to specify the type of build and whether wxWidgets is available. The
relevant symbols are:

__WXDEBUG__ (which is a wxWidgets-defined symbol)
TMDEBUG
TMPROFILE
TMWX

Read further for description of what these symbols do and what combinations are
allowed. For a release build of the full app, #define only TMWX.

Note that if __WXDEBUG__ is defined, you will need to link against the wxWidgets
debug libraries, rather than the release libraries.

You will also need to build the help file (help.zip). Essentially, this
consists of putting the contents of the Source/help folder into a ZIP archive
and creating a cache file using the wxWidgets utility hhp2cached. The location
of these two files is, in general, platform-dependent.

You will also need to copy some contents of the images, resources, and about
folder to locations that are also platform-dependent. Examine the code
for function twmxApp::OnInit() and the wxWidgets documentation to figure out
the appropriate locations for your system.

********************************************************************************
Build styles and preprocessor symbols

The code supports several different build configurations for various stages of
development. The configurations are implemented via compile symbols. The
following is a description of the configuration, how it is implemented, and its
purpose.

Note that you can build the model without wxWidgets in any of the different
styles, but if you do so, you won't link against any wxWidgets libraries
(obviously) and won't define compiler symbol TMWX.

Debug Configuration

  Compiler settings: Define  symbols __WXDEBUG__ and TMWX, no optimizations,
  generate symbols.
  Link against: wxWidgets debug libraries
  Purpose: For debugging either TreeMaker model or GUI using a debugger like
  GDB. Includes full debug symbols for the wxWidgets library, allowing one to
  step into wxW with the debugger. Assertions are tested and break into the
  debugger on failure.

Development Configuration

  Compiler settings: Define symbols TMDEBUG and TMWX, no optimizations,
  generate symbols.
  Link against: wxWidgets release libraries
  Purpose: For early testing by clients. No optimizations, so won't run at max
  speed. Includes debug symbols in the TreeMaker code, but not wxWidgets.
  Assertions are tested; they put up a dialog indicating where failure
  occurred, then program terminates.

Profile Configuration

  Compiler settings: Define symbols TMPROFILE and TMWX, full optimizations,
  generate symbols.
  Link against: wxWidgets release libraries
  Purpose: For profiling and speed optimization. Contains full speed
  optimizations, but still generates symbols so that you can use profiling
  tools. Also writes timing information to the log window (or console, for
  non-TMWX builds). Assertions are compiled out.

Release Configuration

  Compiler settings: Define symbol TMWX, full optimizations, no symbols.
  Link against: wxWidgets release libraries
  Purpose: For final deployment. Assertions are compiled out, no timing
  information is generated, no log messages go anywhere.

********************************************************************************
Test Code

The test files are built as command-line tools and are used to try out and
debug various pieces of the TreeMaker model (no GUI). The test files don't
require all of the source code; the required .cpp files are listed below (if a
folder is listed, compile every .c or .cpp file in the folder). Header search
paths should always include all folders in Source (recursively). Do NOT
#define TMWX for any of the test code.

tmArrayTester.cpp
  Tests the general-purpose container class used throughout TreeMaker.
  Requires:
    tmHeader.cpp
    tmModel/tmPtrClasses
    
tmDpptrTester.cpp
  Tests the dangle-proof pointer and array classes.
  Requires:
    tmHeader.cpp
    tmModel/tmPtrClasses

tmNewtonRaphsonTester.cpp
  Tests the Newton-Raphson root-finding algorithm.
  Requires:
    tmHeader.cpp
    tmModel/tmPtrClasses

tmNLCOTester.cpp
  Tests the nonlinear constrained optimization algorithms.
  Requires:
    tmHeader.cpp
    tmModel/tmPtrClasses
    tmModel/tmNLCO
    tmModel/wnlib

tmModelTester.cpp
  Tests the full TreeMaker model, including optimizers, from the command line.
  The program reads in several test files that are included in the tmModelTester
  folder; you will probably have to adjust the path variable or move the test
  files to the same folder where the app is located.
  Requires:
    tmHeader.cpp
    tmModel (all subdirectorys)

********************************************************************************
Supported Platforms and environments

TreeMaker has been successfully built in the following environments:

Mac OS X -- XCode 2.2 (Apple developer tools). Use TreeMaker.xcodeproj as your
project file. Note that the wxWidget libraries must be built with Mac-specific
options; for simplicity, use the script files in the mac subdirectory. Check
mac/README_mac.txt for further details about building.

Linux -- i386, GCC 4.0.0, GTK+-2.0. Instructions for compiling wxWidget are 
included.

Windows -- MinGW run from windows command box. Use msw/makefile.gcc. Note that
the wxWidget libraries must be built first and that input options passed to
msw/makefile.gcc should match wxWidgets build settings. Check
msw/README_msw.txt for further details about building.


********************************************************************************
Headers, implementations, and comments

As is typical in C++, most class functions are declared in a header (.h) file
and defined in an implementation (.c or .cpp) file. Generally, the purpose of
each function is described in its implementation, which is usually the .cpp
file.

The exception is functions that are defined inline in their header file; they
have a short description within the body of the inline definition.

Class member variables usually have an associated getter function (e.g.,
tmVertex::mDepth has the getter tmVertex::GetDepth()) and the descriptions of
the member variables are usually given with the getter function, rather than at
the point of declaration of the class member variable.

********************************************************************************
TreeMaker names and conventions

Classes are implemented in .h and .cpp files. Thus, class MyClass will have its 
declaration in "MyClass.h" and its implementation in "MyClass.cpp".

Usually "MyClass.cpp" will contain the full implementation for class MyClass.
Most modern filesystems can handle long names, so this convention is used even 
with classes like "tmwxConditionEdgesSameStrainPanel". I tend to favor long 
names that convey what they're used for, rather than cryptic combinations of 
letters whose only positive feature is that they survive in DOS.

In a few cases, I have broken up implementations into several files; these will
have their names extended with "_Usage", e.g., "MyClass_IO.cpp",
"MyClass_Cleanup.cpp", and so forth. Conversely, in a few cases I have grouped
closely-related classes together.

The TreeMaker code can be divided up into several groups:

(1) the TreeMaker mathematical model (tmModel);
(2) The wxWidgets class library (wxW);
(3) the TreeMaker GUI (tmwxGUI).

Which group a particular class or file belongs in can (usually) be inferred 
from its name. The groups are discussed below.

(1) The TreeMaker mathematical model implements the underlying data structure
and provides operations on that data structure through the TreeMaker API. It is
intended to be portable and I make minimal assumptions about the user
interface. Interaction with a UI can be provided by calls to the API, by
subclassing, and use of exceptions (to handle run-time errors). tmModel uses
exceptions, RTTI, and template specialization and so requires a fairly
ANSI-compliant compiler. (I have built it with Metrowerks CodeWarrior and gcc
4.0.)

Every exposed class within tmModel has a class name with a prefix of "tm", 
e.g., tmPoint, tmFloat, tmNode, etc. So if you see tmDoohickey, you know 
that it's part of the model, not the GUI.

(2) The wxWidgets class library is a portable multiplatform GUI tool set. 
Most of the classes and constants in wxWidgets have a prefix of "wx", 
e.g., classes wxWindow, wxTextCtrl; constants wxYES, wxNO, and so forth. 
So wxDoohickey is something from wxWidgets.

(3) The TreeMaker GUI (tmwxGUI) is built on top of the wxWidgets tool set and 
interacts with the TreeMaker mathematical model. I use a prefix scheme for 
GUI classes that is a hybrid of the TreeMaker "tm" and wxWidgets "wx" 
prefices: Namely, all such classes have a prefix "tmwx", e.g., classes 
tmwxApp, tmwxDesignCanvas. If a TreeMaker GUI class has  a name similar 
to a wxWidgets class, it's a pretty safe bet that the former is directly 
descended from the latter; e.g.,

class tmwxApp : public wxApp {
// ...
};

Within both the tmModel and tmwxGUI, I have adopted a few naming conventions 
that are, for the most part, pretty standard.

The two- or four-letter prefix "tm" or "tmwx" is used for the names of classes,
structs, and namespaces in the global namespace, but (usually) not functions,
constants, or variables. Classes that are local to another class, struct, or
namespace usually do not have a prefix.

All classes begin with an uppercase letter, optionally prefixed by "tm" or
"tmwx" as described earlier. All functions begin with an upper-case letter.

All variables begin with a lower-case letter.

Multi-word class, function, and variable names use interCaps to delineate words
(as opposed to, for example, underscores); thus,
"tmwxConditionEdgesSameStrainPanel", not
"tmwx_condition_edges_same_strain_panel".

Most class member variables begin with lower-case "m" followed by a further
descriptive name that begins with upper case: e.g., tmNode::mLoc,
tmNode::mPath. If a member variable is a reference to another class, the member
variable will be called "m" + (classname - prefix); for example, tmNode::mPath
is a tmPath*. Additional words are used in member names to distinguish multiple
variables of the same type, e.g., mLeafNode, mFirstNode, mLastNode, etc. I do
not name object and pointer-to-object member variables differently (e.g., obj
vs pObj) as it's usually clear which a member variable is.

Static member variables begin with lower-case s, e.g., tmNode::sTag.

There are a few exceptions to the mSomething scheme; some lightweight 
mathematical objects have member variables that are meant to be directly 
accessed and have short lower-case names, like tmPoint::x and tmPoint::y.

Function arguments that need no special distinction will usually be named 
"a"+classname, e.g., "aMyClass".

Temporary variables within a function (and frequently loop variables) are often
named "the"+classname, unless, of course, there's more than one, in which case
more descriptive names are used.

Within the tmModel, most function arguments and member variables are pointers 
for historical reasons, even though in some cases reference variables 
might be more appropriate. wxWidgets uses a mixture of pointers and 
references, and the tmwxGUI similarly uses both.

The following things usually have names in ALL_CAPS:
	macros
	constants and enum values
	classes with no members (e.g., exception and template resolution classes)
	
There are exceptions to all these rules. TreeMaker contains code written over
more than a decade, and if old code works, I don't go back and clean it up,
even if it's not perfectly consistent with the naming rules.

*******************************************************************************/