Welcome to FreeCAD 0.9! - free your design

Welcome to TiddlyWiki created by Jeremy Ruston, Copyright © 2007 UnaMesa Association
savetestsavetestsavetest
backstage ↩↪ close backstage ↩↪ close backstage ↩↪ close
backstage: savesync▾import▾tweak▾upgrade▾plugins▾backstage: savesync▾import▾tweak▾upgrade▾plugins▾backstage: savesync▾import▾tweak▾upgrade▾plugins▾
Welcome to FreeCAD 0.9! free your design
Welcome to FreeCAD 0.9! free your design
Welcome
Getting started
Getting help
Release note
closeclose otherseditdeletemorefieldssyncingpermalinkreferencesjump new here new journal

- no tags

Welcome
(updated about 3 months ago by YourName)
Welcome to FreeCAD!
FreeCAD will be a general purpose 3D CAD modeler. The development is completely Open Source (GPL & LGPL License). FreeCAD is aimed directly at mechanical engineering and product design but also fits in a wider range of uses around engineering, such as architecture or other engineering specialties.
FreeCAD features tools similar to Catia, SolidWorks or Solid Edge, and therefore also falls into the category of MCAD, PLM, CAx and CAE. It will be a feature based parametric modeler with a modular software architecture which makes it easy to provide additional functionality without modifying the core system.
closeclose otherseditdeletemorefieldssyncingpermalinkreferencesjump new here new journal

- no tags

Release note
(updated 4 weeks ago by Jürgen)
FreeCAD - 0.9
=============
Targeted mainly towards the Debian integration
- 0000035: [Feature] Change placement behavior (wmayer) - closed.
- 0000036: [Bug] Chnge angle parameters in Part to degree (Jriegel) - closed.
- 0000006: [Feature] Part interface cleanup (Jriegel) - closed.
- 0000004: [Feature] Subelement link property (Jriegel) - closed.
- 0000033: [Feature] Better rotation operations on Placement (wmayer) - closed.
- 0000002: [Bug] Error in Start_Page.html (Jriegel) - closed.
- 0000010: [Bug] pivy does not work and leads to runtime failures (wmayer) - closed.
- 0000030: [Feature] Clean up Raytracing (Jriegel) - closed.
- 0000022: [Feature] Robot simulation Workbench (Jriegel) - closed.
- 0000023: [Feature] Robot object & Grafik representation (Jriegel) - closed.
- 0000024: [Feature] Robot inverse kinematic for a Kuka IR500 (Jriegel) - closed.
- 0000007: [Bug] Help file cannot be opened (wmayer) - closed.
To get a complete overview see the issue tracker on our web site: http://sourceforge.net/apps/mantisbt/free-cad/my_view_page.php

    <!--{{{-->
    <link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
    <!--}}}-->

    Background: #fff
    Foreground: #000
    PrimaryPale: #8cf
    PrimaryLight: #18f
    PrimaryMid: #04b
    PrimaryDark: #014
    SecondaryPale: #ffc
    SecondaryLight: #fe8
    SecondaryMid: #db4
    SecondaryDark: #841
    TertiaryPale: #eee
    TertiaryLight: #ccc
    TertiaryMid: #999
    TertiaryDark: #666
    Error: #f88

    /*{{{*/
    body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

    a {color:[[ColorPalette::PrimaryMid]];}
    a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
    a img {border:0;}

    h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
    h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
    h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

    .button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
    .button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
    .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

    .header {background:[[ColorPalette::PrimaryMid]];}
    .headerShadow {color:[[ColorPalette::Foreground]];}
    .headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
    .headerForeground {color:[[ColorPalette::Background]];}
    .headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

    .tabSelected{color:[[ColorPalette::PrimaryDark]];
    	background:[[ColorPalette::TertiaryPale]];
    	border-left:1px solid [[ColorPalette::TertiaryLight]];
    	border-top:1px solid [[ColorPalette::TertiaryLight]];
    	border-right:1px solid [[ColorPalette::TertiaryLight]];
    }
    .tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
    .tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
    .tabContents .button {border:0;}

    #sidebar {}
    #sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
    #sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
    #sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
    #sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
    #sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

    .wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
    .wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
    .wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
    .wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
    	border:1px solid [[ColorPalette::PrimaryMid]];}
    .wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
    .wizardFooter {background:[[ColorPalette::PrimaryPale]];}
    .wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
    .wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
    	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
    .wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
    .wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
    	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

    .wizard .notChanged {background:transparent;}
    .wizard .changedLocally {background:#80ff80;}
    .wizard .changedServer {background:#8080ff;}
    .wizard .changedBoth {background:#ff8080;}
    .wizard .notFound {background:#ffff80;}
    .wizard .putToServer {background:#ff80ff;}
    .wizard .gotFromServer {background:#80ffff;}

    #messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
    #messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

    .popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

    .popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
    .popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
    .popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
    .popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
    .popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
    .popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
    .popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
    .listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

    .tiddler .defaultCommand {font-weight:bold;}

    .shadow .title {color:[[ColorPalette::TertiaryDark]];}

    .title {color:[[ColorPalette::SecondaryDark]];}
    .subtitle {color:[[ColorPalette::TertiaryDark]];}

    .toolbar {color:[[ColorPalette::PrimaryMid]];}
    .toolbar a {color:[[ColorPalette::TertiaryLight]];}
    .selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
    .selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

    .tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
    .selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
    .tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
    .tagging .button, .tagged .button {border:none;}

    .footer {color:[[ColorPalette::TertiaryLight]];}
    .selected .footer {color:[[ColorPalette::TertiaryMid]];}

    .sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
    .sparktick {background:[[ColorPalette::PrimaryDark]];}

    .error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
    .warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
    .lowlight {background:[[ColorPalette::TertiaryLight]];}

    .zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

    .imageLink, #displayArea .imageLink {background:transparent;}

    .annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

    .viewer .listTitle {list-style-type:none; margin-left:-2em;}
    .viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
    .viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

    .viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
    .viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
    .viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

    .viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
    .viewer code {color:[[ColorPalette::SecondaryDark]];}
    .viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

    .highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

    .editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
    .editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
    .editorFooter {color:[[ColorPalette::TertiaryMid]];}

    #backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
    #backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
    #backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
    #backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
    #backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
    #backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
    #backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
    .backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
    .backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
    #backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity:60)';}
    /*}}}*/

    /*{{{*/
    * html .tiddler {height:1%;}

    body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

    h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
    h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
    h4,h5,h6 {margin-top:1em;}
    h1 {font-size:1.35em;}
    h2 {font-size:1.25em;}
    h3 {font-size:1.1em;}
    h4 {font-size:1em;}
    h5 {font-size:.9em;}

    hr {height:1px;}

    a {text-decoration:none;}

    dt {font-weight:bold;}

    ol {list-style-type:decimal;}
    ol ol {list-style-type:lower-alpha;}
    ol ol ol {list-style-type:lower-roman;}
    ol ol ol ol {list-style-type:decimal;}
    ol ol ol ol ol {list-style-type:lower-alpha;}
    ol ol ol ol ol ol {list-style-type:lower-roman;}
    ol ol ol ol ol ol ol {list-style-type:decimal;}

    .txtOptionInput {width:11em;}

    #contentWrapper .chkOptionInput {border:0;}

    .externalLink {text-decoration:underline;}

    .indent {margin-left:3em;}
    .outdent {margin-left:3em; text-indent:-3em;}
    code.escaped {white-space:nowrap;}

    .tiddlyLinkExisting {font-weight:bold;}
    .tiddlyLinkNonExisting {font-style:italic;}

    /* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
    a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

    #mainMenu .tiddlyLinkExisting,
    	#mainMenu .tiddlyLinkNonExisting,
    	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
    #sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

    .header {position:relative;}
    .header a:hover {background:transparent;}
    .headerShadow {position:relative; padding:4.5em 0em 1em 1em; left:-1px; top:-1px;}
    .headerForeground {position:absolute; padding:4.5em 0em 1em 1em; left:0px; top:0px;}

    .siteTitle {font-size:3em;}
    .siteSubtitle {font-size:1.2em;}

    #mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

    #sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
    #sidebarOptions {padding-top:0.3em;}
    #sidebarOptions a {margin:0em 0.2em; padding:0.2em 0.3em; display:block;}
    #sidebarOptions input {margin:0.4em 0.5em;}
    #sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
    #sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
    #sidebarOptions .sliderPanel input {margin:0 0 .3em 0;}
    #sidebarTabs .tabContents {width:15em; overflow:hidden;}

    .wizard {padding:0.1em 1em 0em 2em;}
    .wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
    .wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
    .wizardStep {padding:1em 1em 1em 1em;}
    .wizard .button {margin:0.5em 0em 0em 0em; font-size:1.2em;}
    .wizardFooter {padding:0.8em 0.4em 0.8em 0em;}
    .wizardFooter .status {padding:0em 0.4em 0em 0.4em; margin-left:1em;}
    .wizard .button {padding:0.1em 0.2em 0.1em 0.2em;}

    #messageArea {position:fixed; top:2em; right:0em; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
    .messageToolbar {display:block; text-align:right; padding:0.2em 0.2em 0.2em 0.2em;}
    #messageArea a {text-decoration:underline;}

    .tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
    .popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 1em; margin:0;}

    .popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
    .popup .popupMessage {padding:0.4em;}
    .popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0em;}
    .popup li.disabled {padding:0.4em;}
    .popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
    .listBreak {font-size:1px; line-height:1px;}
    .listBreak div {margin:2px 0;}

    .tabset {padding:1em 0em 0em 0.5em;}
    .tab {margin:0em 0em 0em 0.25em; padding:2px;}
    .tabContents {padding:0.5em;}
    .tabContents ul, .tabContents ol {margin:0; padding:0;}
    .txtMainTab .tabContents li {list-style:none;}
    .tabContents li.listLink { margin-left:.75em;}

    #contentWrapper {display:block;}
    #splashScreen {display:none;}

    #displayArea {margin:1em 17em 0em 14em;}

    .toolbar {text-align:right; font-size:.9em;}

    .tiddler {padding:1em 1em 0em 1em;}

    .missing .viewer,.missing .title {font-style:italic;}

    .title {font-size:1.6em; font-weight:bold;}

    .missing .subtitle {display:none;}
    .subtitle {font-size:1.1em;}

    .tiddler .button {padding:0.2em 0.4em;}

    .tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
    .isTag .tagging {display:block;}
    .tagged {margin:0.5em; float:right;}
    .tagging, .tagged {font-size:0.9em; padding:0.25em;}
    .tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
    .tagClear {clear:both;}

    .footer {font-size:.9em;}
    .footer li {display:inline;}

    .annotation {padding:0.5em; margin:0.5em;}

    * html .viewer pre {width:99%; padding:0 0 1em 0;}
    .viewer {line-height:1.4em; padding-top:0.5em;}
    .viewer .button {margin:0em 0.25em; padding:0em 0.25em;}
    .viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
    .viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

    .viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
    .viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
    table.listView {font-size:0.85em; margin:0.8em 1.0em;}
    table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}

    .viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
    .viewer code {font-size:1.2em; line-height:1.4em;}

    .editor {font-size:1.1em;}
    .editor input, .editor textarea {display:block; width:100%; font:inherit;}
    .editorFooter {padding:0.25em 0em; font-size:.9em;}
    .editorFooter .button {padding-top:0px; padding-bottom:0px;}

    .fieldsetFix {border:0; padding:0; margin:1px 0px 1px 0px;}

    .sparkline {line-height:1em;}
    .sparktick {outline:0;}

    .zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
    .zoomer div {padding:1em;}

    * html #backstage {width:99%;}
    * html #backstageArea {width:99%;}
    #backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em 0.3em 0.5em;}
    #backstageToolbar {position:relative;}
    #backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}
    #backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}
    #backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}
    #backstage {position:relative; width:100%; z-index:50;}
    #backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}
    .backstagePanelFooter {padding-top:0.2em; float:right;}
    .backstagePanelFooter a {padding:0.2em 0.4em 0.2em 0.4em;}
    #backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

    .whenBackstage {display:none;}
    .backstageVisible .whenBackstage {display:block;}
    /*}}}*/

    /***
    StyleSheet for use when a translation requires any css style changes.
    This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
    ***/
    /*{{{*/
    body {font-size:0.8em;}
    #sidebarOptions {font-size:1.05em;}
    #sidebarOptions a {font-style:normal;}
    #sidebarOptions .sliderPanel {font-size:0.95em;}
    .subtitle {font-size:0.8em;}
    .viewer table.listView {font-size:0.95em;}
    /*}}}*/

    /*{{{*/
    @media print {
    #mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none ! important;}
    #displayArea {margin: 1em 1em 0em 1em;}
    /* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
    noscript {display:none;}
    }
    /*}}}*/

    <!--{{{-->
    <div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
    <div class='headerShadow'>
    <span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
    <span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
    </div>
    <div class='headerForeground'>
    <span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
    <span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
    </div>
    </div>
    <div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
    <div id='sidebar'>
    <div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
    <div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
    </div>
    <div id='displayArea'>
    <div id='messageArea'></div>
    <div id='tiddlerDisplay'></div>
    </div>
    <!--}}}-->

    <!--{{{-->
    <div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
    <div class='title' macro='view title'></div>
    <div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
    <div class='tagging' macro='tagging'></div>
    <div class='tagged' macro='tags'></div>
    <div class='viewer' macro='view text wikified'></div>
    <div class='tagClear'></div>
    <!--}}}-->

    <!--{{{-->
    <div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
    <div class='title' macro='view title'></div>
    <div class='editor' macro='edit title'></div>
    <div macro='annotations'></div>
    <div class='editor' macro='edit text'></div>
    <div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
    <!--}}}-->

    To get started with this blank TiddlyWiki, you'll need to modify the following tiddlers:
    * SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
    * MainMenu: The menu (usually on the left)
    * DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
    You'll also need to enter your username for signing your edits: <<option txtUserName>>

    These InterfaceOptions for customising TiddlyWiki are saved in your browser

    Your username for signing your edits. Write it as a WikiWord (eg JoeBloggs)

    <<option txtUserName>>
    <<option chkSaveBackups>> SaveBackups
    <<option chkAutoSave>> AutoSave
    <<option chkRegExpSearch>> RegExpSearch
    <<option chkCaseSensitiveSearch>> CaseSensitiveSearch
    <<option chkAnimate>> EnableAnimations

    ----
    Also see [[AdvancedOptions]]

    <<importTiddlers>>

    /***
    |Name:|CloseOnCancelPlugin|
    |Description:|Closes the tiddler if you click new tiddler then cancel. Default behaviour is to leave it open|
    |Version:|3.0.1 ($Rev: 3861 $)|
    |Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
    |Source:|http://mptw.tiddlyspot.com/#CloseOnCancelPlugin|
    |Author:|Simon Baird <simon.baird@gmail.com>|
    |License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
    ***/
    //{{{
    merge(config.commands.cancelTiddler,{

    	handler_mptw_orig_closeUnsaved: config.commands.cancelTiddler.handler,

    	handler: function(event,src,title) {
    		this.handler_mptw_orig_closeUnsaved(event,src,title);
    		if (!store.tiddlerExists(title) && !store.isShadowTiddler(title))
    			story.closeTiddler(title,true);
    	 	return false;
    	}

    });

    //}}}

    [[Welcome]]
    [[New features]]

    /***
    |Name:|ExtentTagButtonPlugin|
    |Description:|Adds a New tiddler button in the tag drop down|
    |Version:|3.2 ($Rev: 3861 $)|
    |Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
    |Source:|http://mptw.tiddlyspot.com/#ExtendTagButtonPlugin|
    |Author:|Simon Baird <simon.baird@gmail.com>|
    |License|http://mptw.tiddlyspot.com/#TheBSDLicense|
    ***/
    //{{{

    window.onClickTag_mptw_orig = window.onClickTag;
    window.onClickTag = function(e) {
    	window.onClickTag_mptw_orig.apply(this,arguments);
    	var tag = this.getAttribute("tag");
    	var title = this.getAttribute("tiddler");
    	// Thanks Saq, you're a genius :)
    	var popup = Popup.stack[Popup.stack.length-1].popup;
    	createTiddlyElement(createTiddlyElement(popup,"li",null,"listBreak"),"div");
    	wikify("<<newTiddler label:'New tiddler' tag:'"+tag+"'>>",createTiddlyElement(popup,"li"));
    	return false;
    }

    //}}}

    FreeCAD will be a general purpose 3D CAD modeler. The development is completely Open Source (GPL & LGPL License). FreeCAD is aimed directly at mechanical engineering and product design but also fits in a wider range of uses around engineering, such as architecture or other engineering specialties.

    FreeCAD features tools similar to Catia, SolidWorks or Solid Edge, and therefore also falls into the category of MCAD, PLM, CAx and CAE. It will be a feature based parametric modeler with a modular software architecture which makes it easy to provide additional functionality without modifying the core system.

    As with many modern 3D CAD modelers it will have a 2D component in order to extract design detail from the 3D model to create 2D production drawings, but direct 2D drawing (like AutoCAD LT) is not the focus, neither are animation or organic shapes (like Maya, 3ds Max or Cinema 4D), although, thanks to its wide adaptability, FreeCAD might become useful in a much broader area than its current focus.

    Another major concern of FreeCAD is to make heavy use of all the great open-source libraries that exist out there in the field of Scientific Computing. Among them are OpenCascade, a powerful CAD kernel, Coin3D, an incarnation of OpenInventor, Qt, the world-famous UI framework, and Python, one of the best scripting languages available. FreeCAD itself can also be used as a library by other programs.

    FreeCAD is also fully multi-platform, and currently runs flawlessly on Windows and Linux/Unix and Mac OSX systems, with the exact same look and functionality on all platforms.

    There are different ways to get help:
    * Use the help system with the Help menu
    * Visit the FreeCAD documentation wiki: http://www.freecadweb.org/wiki/index.php
    * Or use the on line help forum to ask questions: http://sourceforge.net/apps/phpbb/free-cad/index.php

    Foreword

    FreeCAD is a CAD/CAE parametric modeling application. It is still in early stage of development, so don't expect to be able to use it to produce work already. But, if you are curious about what FreeCAD looks like and what features are being developed, you are welcome to download it and give it a try. At the moment, much functionality is already present, but not much user interface has been created for it. This means that if you know a bit of python, you will already be able to produce and modify geometry relatively easily. If not, you will probably find that FreeCAD still has few to offer to you. But, be patient, this is expected to change soon.

    /***
    |Name:|HideWhenPlugin|
    |Description:|Allows conditional inclusion/exclusion in templates|
    |Version:|3.1 ($Rev: 3919 $)|
    |Date:|$Date: 2008-03-13 02:03:12 +1000 (Thu, 13 Mar 2008) $|
    |Source:|http://mptw.tiddlyspot.com/#HideWhenPlugin|
    |Author:|Simon Baird <simon.baird@gmail.com>|
    |License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
    For use in ViewTemplate and EditTemplate. Example usage:
    {{{<div macro="showWhenTagged Task">[[TaskToolbar]]</div>}}}
    {{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}
    ***/
    //{{{

    window.hideWhenLastTest = false;

    window.removeElementWhen = function(test,place) {
    	window.hideWhenLastTest = test;
    	if (test) {
    		removeChildren(place);
    		place.parentNode.removeChild(place);
    	}
    };

    merge(config.macros,{

    	hideWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
    		removeElementWhen( eval(paramString), place);
    	}},

    	showWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
    		removeElementWhen( !eval(paramString), place);
    	}},

    	hideWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
    		removeElementWhen( tiddler.tags.containsAll(params), place);
    	}},

    	showWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
    		removeElementWhen( !tiddler.tags.containsAll(params), place);
    	}},

    	hideWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
    		removeElementWhen( tiddler.tags.containsAny(params), place);
    	}},

    	showWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
    		removeElementWhen( !tiddler.tags.containsAny(params), place);
    	}},

    	hideWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
    		removeElementWhen( tiddler.tags.containsAll(params), place);
    	}},

    	showWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
    		removeElementWhen( !tiddler.tags.containsAll(params), place);
    	}},

    	hideWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
    		removeElementWhen( store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0]), place);
    	}},

    	showWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
    		removeElementWhen( !(store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0])), place);
    	}},

    	hideWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
    		removeElementWhen( tiddler.title == params[0], place);
    	}},

    	showWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
    		removeElementWhen( tiddler.title != params[0], place);
    	}},

    	'else': { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
    		removeElementWhen( !window.hideWhenLastTest, place);
    	}}

    });

    //}}}

    /***
    |Name:|InstantTimestampPlugin|
    |Description:|A handy way to insert timestamps in your tiddler content|
    |Version:|1.0.10 ($Rev: 3646 $)|
    |Date:|$Date: 2008-02-27 02:34:38 +1000 (Wed, 27 Feb 2008) $|
    |Source:|http://mptw.tiddlyspot.com/#InstantTimestampPlugin|
    |Author:|Simon Baird <simon.baird@gmail.com>|
    |License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
    !!Usage
    If you enter {ts} in your tiddler content (without the spaces) it will be replaced with a timestamp when you save the tiddler. Full list of formats:
    * {ts} or {t} -> timestamp
    * {ds} or {d} -> datestamp
    * !ts or !t at start of line -> !!timestamp
    * !ds or !d at start of line -> !!datestamp
    (I added the extra ! since that's how I like it. Remove it from translations below if required)
    !!Notes
    * Change the timeFormat and dateFormat below to suit your preference.
    * See also http://mptw2.tiddlyspot.com/#AutoCorrectPlugin
    * You could invent other translations and add them to the translations array below.
    ***/
    //{{{

    config.InstantTimestamp = {

    	// adjust to suit
    	timeFormat: 'DD/0MM/YY 0hh:0mm',
    	dateFormat: 'DD/0MM/YY',

    	translations: [
    		[/^!ts?$/img,  "'!!{{ts{'+now.formatString(config.InstantTimestamp.timeFormat)+'}}}'"],
    		[/^!ds?$/img,  "'!!{{ds{'+now.formatString(config.InstantTimestamp.dateFormat)+'}}}'"],

    		// thanks Adapted Cat
    		[/\{ts?\}(?!\}\})/ig,"'{{ts{'+now.formatString(config.InstantTimestamp.timeFormat)+'}}}'"],
    		[/\{ds?\}(?!\}\})/ig,"'{{ds{'+now.formatString(config.InstantTimestamp.dateFormat)+'}}}'"]

    	],

    	excludeTags: [
    		"noAutoCorrect",
    		"noTimestamp",
    		"html",
    		"CSS",
    		"css",
    		"systemConfig",
    		"systemConfigDisabled",
    		"zsystemConfig",
    		"Plugins",
    		"Plugin",
    		"plugins",
    		"plugin",
    		"javascript",
    		"code",
    		"systemTheme",
    		"systemPalette"
    	],

    	excludeTiddlers: [
    		"StyleSheet",
    		"StyleSheetLayout",
    		"StyleSheetColors",
    		"StyleSheetPrint"
    		// more?
    	]

    };

    TiddlyWiki.prototype.saveTiddler_mptw_instanttimestamp = TiddlyWiki.prototype.saveTiddler;
    TiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created) {

    	tags = tags ? tags : []; // just in case tags is null
    	tags = (typeof(tags) == "string") ? tags.readBracketedList() : tags;
    	var conf = config.InstantTimestamp;

    	if ( !tags.containsAny(conf.excludeTags) && !conf.excludeTiddlers.contains(newTitle) ) {

    		var now = new Date();
    		var trans = conf.translations;
    		for (var i=0;i<trans.length;i++) {
    			newBody = newBody.replace(trans[i][0], eval(trans[i][1]));
    		}
    	}

    	// TODO: use apply() instead of naming all args?
    	return this.saveTiddler_mptw_instanttimestamp(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created);
    }

    // you can override these in StyleSheet
    setStylesheet(".ts,.ds { font-style:italic; }","instantTimestampStyles");

    //}}}

    /***
    |Name:|LessBackupsPlugin|
    |Description:|Intelligently limit the number of backup files you create|
    |Version:|3.0.1 ($Rev: 2320 $)|
    |Date:|$Date: 2007-06-18 22:37:46 +1000 (Mon, 18 Jun 2007) $|
    |Source:|http://mptw.tiddlyspot.com/#LessBackupsPlugin|
    |Author:|Simon Baird|
    |Email:|simon.baird@gmail.com|
    |License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
    !!Description
    You end up with just backup one per year, per month, per weekday, per hour, minute, and second.  So total number won't exceed about 200 or so. Can be reduced by commenting out the seconds/minutes/hours line from modes array
    !!Notes
    Works in IE and Firefox only.  Algorithm by Daniel Baird. IE specific code by by Saq Imtiaz.
    ***/
    //{{{

    var MINS  = 60 * 1000;
    var HOURS = 60 * MINS;
    var DAYS  = 24 * HOURS;

    if (!config.lessBackups) {
    	config.lessBackups = {
    		// comment out the ones you don't want or set config.lessBackups.modes in your 'tweaks' plugin
    		modes: [
    			["YYYY",  365*DAYS], // one per year for ever
    			["MMM",   31*DAYS],  // one per month
    			["ddd",   7*DAYS],   // one per weekday
    			//["d0DD",  1*DAYS],   // one per day of month
    			["h0hh",  24*HOURS], // one per hour
    			["m0mm",  1*HOURS],  // one per minute
    			["s0ss",  1*MINS],   // one per second
    			["latest",0]         // always keep last version. (leave this).
    		]
    	};
    }

    window.getSpecialBackupPath = function(backupPath) {

    	var now = new Date();

    	var modes = config.lessBackups.modes;

    	for (var i=0;i<modes.length;i++) {

    		// the filename we will try
    		var specialBackupPath = backupPath.replace(/(\.)([0-9]+\.[0-9]+)(\.html)$/,
    				'$1'+now.formatString(modes[i][0]).toLowerCase()+'$3')

    		// open the file
    		try {
    			if (config.browser.isIE) {
    				var fsobject = new ActiveXObject("Scripting.FileSystemObject")
    				var fileExists  = fsobject.FileExists(specialBackupPath);
    				if (fileExists) {
    					var fileObject = fsobject.GetFile(specialBackupPath);
    					var modDate = new Date(fileObject.DateLastModified).valueOf();
    				}
    			}
    			else {
    				netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
    				var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
    				file.initWithPath(specialBackupPath);
    				var fileExists = file.exists();
    				if (fileExists) {
    					var modDate = file.lastModifiedTime;
    				}
    			}
    		}
    		catch(e) {
    			// give up
    			return backupPath;
    		}

    		// expiry is used to tell if it's an 'old' one. Eg, if the month is June and there is a
    		// June file on disk that's more than an month old then it must be stale so overwrite
    		// note that "latest" should be always written because the expiration period is zero (see above)
    		var expiry = new Date(modDate + modes[i][1]);
    		if (!fileExists || now > expiry)
    			return specialBackupPath;
    	}
    }

    // hijack the core function
    window.getBackupPath_mptw_orig = window.getBackupPath;
    window.getBackupPath = function(localPath) {
    	return getSpecialBackupPath(getBackupPath_mptw_orig(localPath));
    }

    //}}}

    MPTW is a distribution or edition of TiddlyWiki that includes a standard TiddlyWiki core packaged with some plugins designed to improve usability and provide a better way to organise your information. For more information see http://mptw.tiddlyspot.com/.

    [[Welcome]]
    [[Getting started]]
    [[Getting help]]
    [[Release note]]

    Name: MptwBlack
    Background: #000
    Foreground: #fff
    PrimaryPale: #333
    PrimaryLight: #555
    PrimaryMid: #888
    PrimaryDark: #aaa
    SecondaryPale: #111
    SecondaryLight: #222
    SecondaryMid: #555
    SecondaryDark: #888
    TertiaryPale: #222
    TertiaryLight: #666
    TertiaryMid: #888
    TertiaryDark: #aaa
    Error: #300

    This is in progress. Help appreciated.

    Name: MptwBlue
    Background: #fff
    Foreground: #000
    PrimaryPale: #cdf
    PrimaryLight: #57c
    PrimaryMid: #114
    PrimaryDark: #012
    SecondaryPale: #ffc
    SecondaryLight: #fe8
    SecondaryMid: #db4
    SecondaryDark: #841
    TertiaryPale: #eee
    TertiaryLight: #ccc
    TertiaryMid: #999
    TertiaryDark: #666
    Error: #f88

    /***
    |Name:|MptwConfigPlugin|
    |Description:|Miscellaneous tweaks used by MPTW|
    |Version:|1.0 ($Rev: 3646 $)|
    |Date:|$Date: 2008-02-27 02:34:38 +1000 (Wed, 27 Feb 2008) $|
    |Source:|http://mptw.tiddlyspot.com/#MptwConfigPlugin|
    |Author:|Simon Baird <simon.baird@gmail.com>|
    |License:|http://mptw.tiddlyspot.com/#MptwConfigPlugin|
    !!Note: instead of editing this you should put overrides in MptwUserConfigPlugin
    ***/
    //{{{
    var originalReadOnly = readOnly;
    var originalShowBackstage = showBackstage;

    config.options.chkHttpReadOnly = false; 		// means web visitors can experiment with your site by clicking edit
    readOnly = false;								// needed because the above doesn't work any more post 2.1 (??)
    showBackstage = true;							// show backstage for same reason

    config.options.chkInsertTabs = true;    		// tab inserts a tab when editing a tiddler
    config.views.wikified.defaultText = "";			// don't need message when a tiddler doesn't exist
    config.views.editor.defaultText = "";			// don't need message when creating a new tiddler

    config.options.chkSaveBackups = true;			// do save backups
    config.options.txtBackupFolder = 'twbackup';	// put backups in a backups folder

    config.options.chkAutoSave = (window.location.protocol == "file:"); // do autosave if we're in local file

    config.mptwVersion = "2.5.3";

    config.macros.mptwVersion={handler:function(place){wikify(config.mptwVersion,place);}};

    if (config.options.txtTheme == '')
    	config.options.txtTheme = 'MptwTheme';

    // add to default GettingStarted
    config.shadowTiddlers.GettingStarted += "\n\nSee also [[MPTW]].";

    // add select theme and palette controls in default OptionsPanel
    config.shadowTiddlers.OptionsPanel = config.shadowTiddlers.OptionsPanel.replace(/(\n\-\-\-\-\nAlso see AdvancedOptions)/, "{{select{<<selectTheme>>\n<<selectPalette>>}}}$1");

    // these are used by ViewTemplate
    config.mptwDateFormat = 'DD/MM/YY';
    config.mptwJournalFormat = 'Journal DD/MM/YY';

    //}}}

    Name: MptwGreen
    Background: #fff
    Foreground: #000
    PrimaryPale: #9b9
    PrimaryLight: #385
    PrimaryMid: #031
    PrimaryDark: #020
    SecondaryPale: #ffc
    SecondaryLight: #fe8
    SecondaryMid: #db4
    SecondaryDark: #841
    TertiaryPale: #eee
    TertiaryLight: #ccc
    TertiaryMid: #999
    TertiaryDark: #666
    Error: #f88

    Name: MptwRed
    Background: #fff
    Foreground: #000
    PrimaryPale: #eaa
    PrimaryLight: #c55
    PrimaryMid: #711
    PrimaryDark: #500
    SecondaryPale: #ffc
    SecondaryLight: #fe8
    SecondaryMid: #db4
    SecondaryDark: #841
    TertiaryPale: #eee
    TertiaryLight: #ccc
    TertiaryMid: #999
    TertiaryDark: #666
    Error: #f88

    |Name|MptwRounded|
    |Description|Mptw Theme with some rounded corners (Firefox only)|
    |ViewTemplate|MptwTheme##ViewTemplate|
    |EditTemplate|MptwTheme##EditTemplate|
    |PageTemplate|MptwTheme##PageTemplate|
    |StyleSheet|##StyleSheet|

    !StyleSheet
    /*{{{*/

    [[MptwTheme##StyleSheet]]

    .tiddler,
    .sliderPanel,
    .button,
    .tiddlyLink,
    .tabContents
    { -moz-border-radius: 1em; }

    .tab {
    	-moz-border-radius-topleft: 0.5em;
    	-moz-border-radius-topright: 0.5em;
    }
    #topMenu {
    	-moz-border-radius-bottomleft: 2em;
    	-moz-border-radius-bottomright: 2em;
    }

    /*}}}*/

    Name: MptwSmoke
    Background: #fff
    Foreground: #000
    PrimaryPale: #aaa
    PrimaryLight: #777
    PrimaryMid: #111
    PrimaryDark: #000
    SecondaryPale: #ffc
    SecondaryLight: #fe8
    SecondaryMid: #db4
    SecondaryDark: #841
    TertiaryPale: #eee
    TertiaryLight: #ccc
    TertiaryMid: #999
    TertiaryDark: #666
    Error: #f88

    |Name|MptwStandard|
    |Description|Mptw Theme with the default TiddlyWiki PageLayout and Styles|
    |ViewTemplate|MptwTheme##ViewTemplate|
    |EditTemplate|MptwTheme##EditTemplate|

    Name: MptwTeal
    Background: #fff
    Foreground: #000
    PrimaryPale: #B5D1DF
    PrimaryLight: #618FA9
    PrimaryMid: #1a3844
    PrimaryDark: #000
    SecondaryPale: #ffc
    SecondaryLight: #fe8
    SecondaryMid: #db4
    SecondaryDark: #841
    TertiaryPale: #f8f8f8
    TertiaryLight: #bbb
    TertiaryMid: #999
    TertiaryDark: #888
    Error: #f88

    |Name|MptwTheme|
    |Description|Mptw Theme including custom PageLayout|
    |PageTemplate|##PageTemplate|
    |ViewTemplate|##ViewTemplate|
    |EditTemplate|##EditTemplate|
    |StyleSheet|##StyleSheet|

    http://mptw.tiddlyspot.com/#MptwTheme ($Rev: 1829 $)

    !PageTemplate
    <!--{{{-->
    <div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
    	<div class='headerShadow'>
    		<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
    		<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
    	</div>
    	<div class='headerForeground'>
    		<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
    		<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
    	</div>
    </div>
    <!-- horizontal MainMenu -->
    <div id='topMenu' refresh='content' tiddler='MainMenu'></div>
    <!-- original MainMenu menu -->
    <!-- <div id='mainMenu' refresh='content' tiddler='MainMenu'></div> -->
    <div id='sidebar'>
    	<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
    	<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
    </div>
    <div id='displayArea'>
    	<div id='messageArea'></div>
    	<div id='tiddlerDisplay'></div>
    </div>
    <!--}}}-->

    !ViewTemplate
    <!--{{{-->
    [[MptwTheme##ViewTemplateToolbar]]

    <div class="tagglyTagged" macro="tags"></div>

    <div class='titleContainer'>
    	<span class='title' macro='view title'></span>
    	<span macro="miniTag"></span>
    </div>

    <div class='subtitle'>
    	(updated <span macro='view modified date {{config.mptwDateFormat?config.mptwDateFormat:"MM/0DD/YY"}}'></span>
    	by <span macro='view modifier link'></span>)
    	<!--
    	(<span macro='message views.wikified.createdPrompt'></span>
    	<span macro='view created date {{config.mptwDateFormat?config.mptwDateFormat:"MM/0DD/YY"}}'></span>)
    	-->
    </div>

    <div macro="showWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')">
    	<div class='viewer'><pre macro='view text'></pre></div>
    </div>
    <div macro="else">
    	<div class='viewer' macro='view text wikified'></div>
    </div>

    <div class="tagglyTagging" macro="tagglyTagging"></div>

    <!--}}}-->

    !ViewTemplateToolbar
    <!--{{{-->
    <div class='toolbar'>
    	<span macro="showWhenTagged systemConfig">
    		<span macro="toggleTag systemConfigDisable . '[[disable|systemConfigDisable]]'"></span>
    	</span>
    	<span macro="showWhenTagged systemTheme"><span macro="applyTheme"></span></span>
    	<span macro="showWhenTagged systemPalette"><span macro="applyPalette"></span></span>
    	<span macro="showWhen tiddler.tags.contains('css') || tiddler.title == 'StyleSheet'"><span macro="refreshAll"></span></span>
    	<span style="padding:1em;"></span>
    	<span macro='toolbar closeTiddler closeOthers +editTiddler deleteTiddler > fields syncing permalink references jump'></span> <span macro='newHere label:"new here"'></span>
    	<span macro='newJournalHere {{config.mptwJournalFormat?config.mptwJournalFormat:"MM/0DD/YY"}}'></span>
    </div>
    <!--}}}-->

    !EditTemplate
    <!--{{{-->
    <div class="toolbar" macro="toolbar +saveTiddler saveCloseTiddler closeOthers -cancelTiddler cancelCloseTiddler deleteTiddler"></div>
    <div class="title" macro="view title"></div>
    <div class="editLabel">Title</div><div class="editor" macro="edit title"></div>
    <div macro='annotations'></div>
    <div class="editLabel">Content</div><div class="editor" macro="edit text"></div>
    <div class="editLabel">Tags</div><div class="editor" macro="edit tags"></div>
    <div class="editorFooter"><span macro="message views.editor.tagPrompt"></span><span macro="tagChooser"></span></div>
    <!--}}}-->

    !StyleSheet
    /*{{{*/

    /* a contrasting background so I can see where one tiddler ends and the other begins */
    body {
    	background: [[ColorPalette::TertiaryLight]];
    }

    /* sexy colours and font for the header */
    .headerForeground {
    	color: [[ColorPalette::PrimaryPale]];
    }
    .headerShadow, .headerShadow a {
    	color: [[ColorPalette::PrimaryMid]];
    }

    /* separate the top menu parts */
    .headerForeground, .headerShadow {
    	padding: 1em 1em 0;
    }

    .headerForeground, .headerShadow {
    	font-family: 'Trebuchet MS' sans-serif;
    	font-weight:bold;
    }
    .headerForeground .siteSubtitle {
    	color: [[ColorPalette::PrimaryLight]];
    }
    .headerShadow .siteSubtitle {
    	color: [[ColorPalette::PrimaryMid]];
    }

    /* make shadow go and down right instead of up and left */
    .headerShadow {
    	left: 1px;
    	top: 1px;
    }

    /* prefer monospace for editing */
    .editor textarea, .editor input {
    	font-family: 'Consolas' monospace;
    	background-color:[[ColorPalette::TertiaryPale]];
    }

    /* sexy tiddler titles */
    .title {
    	font-size: 250%;
    	color: [[ColorPalette::PrimaryLight]];
    	font-family: 'Trebuchet MS' sans-serif;
    }

    /* more subtle tiddler subtitle */
    .subtitle {
    	padding:0px;
    	margin:0px;
    	padding-left:1em;
    	font-size: 90%;
    	color: [[ColorPalette::TertiaryMid]];
    }
    .subtitle .tiddlyLink {
    	color: [[ColorPalette::TertiaryMid]];
    }

    /* a little bit of extra whitespace */
    .viewer {
    	padding-bottom:3px;
    }

    /* don't want any background color for headings */
    h1,h2,h3,h4,h5,h6 {
    	background-color: transparent;
    	color: [[ColorPalette::Foreground]];
    }

    /* give tiddlers 3d style border and explicit background */
    .tiddler {
    	background: [[ColorPalette::Background]];
    	border-right: 2px [[ColorPalette::TertiaryMid]] solid;
    	border-bottom: 2px [[ColorPalette::TertiaryMid]] solid;
    	margin-bottom: 1em;
    	padding:1em 2em 2em 1.5em;
    }

    /* make options slider look nicer */
    #sidebarOptions .sliderPanel {
    	border:solid 1px [[ColorPalette::PrimaryLight]];
    }

    /* the borders look wrong with the body background */
    #sidebar .button {
    	border-style: none;
    }

    /* this means you can put line breaks in SidebarOptions for readability */
    #sidebarOptions br {
    	display:none;
    }
    /* undo the above in OptionsPanel */
    #sidebarOptions .sliderPanel br {
    	display:inline;
    }

    /* horizontal main menu stuff */
    #displayArea {
    	margin: 1em 15.7em 0em 1em; /* use the freed up space */
    }
    #topMenu br {
    	display: none;
    }
    #topMenu {
    	background: [[ColorPalette::PrimaryMid]];
    	color:[[ColorPalette::PrimaryPale]];
    }
    #topMenu {
    	padding:2px;
    }
    #topMenu .button, #topMenu .tiddlyLink, #topMenu a {
    	margin-left: 0.5em;
    	margin-right: 0.5em;
    	padding-left: 3px;
    	padding-right: 3px;
    	color: [[ColorPalette::PrimaryPale]];
    	font-size: 115%;
    }
    #topMenu .button:hover, #topMenu .tiddlyLink:hover {
    	background: [[ColorPalette::PrimaryDark]];
    }

    /* make 2.2 act like 2.1 with the invisible buttons */
    .toolbar {
    	visibility:hidden;
    }
    .selected .toolbar {
    	visibility:visible;
    }

    /* experimental. this is a little borked in IE7 with the button
     * borders but worth it I think for the extra screen realestate */
    .toolbar { float:right; }

    /* fix for TaggerPlugin. from sb56637. improved by FND */
    .popup li .tagger a {
       display:inline;
    }

    /* makes theme selector look a little better */
    #sidebarOptions .sliderPanel .select .button {
      padding:0.5em;
      display:block;
    }
    #sidebarOptions .sliderPanel .select br {
    	display:none;
    }

    /* make it print a little cleaner */
    @media print {
    	#topMenu {
    		display: none ! important;
    	}
    	/* not sure if we need all the importants */
    	.tiddler {
    		border-style: none ! important;
    		margin:0px ! important;
    		padding:0px ! important;
    		padding-bottom:2em ! important;
    	}
    	.tagglyTagging .button, .tagglyTagging .hidebutton {
    		display: none ! important;
    	}
    	.headerShadow {
    		visibility: hidden ! important;
    	}
    	.tagglyTagged .quickopentag, .tagged .quickopentag {
    		border-style: none ! important;
    	}
    	.quickopentag a.button, .miniTag {
    		display: none ! important;
    	}
    }

    /* get user styles specified in StyleSheet */
    [[StyleSheet]]

    /*}}}*/

    |Name|MptwTrim|
    |Description|Mptw Theme with a reduced header to increase useful space|
    |ViewTemplate|MptwTheme##ViewTemplate|
    |EditTemplate|MptwTheme##EditTemplate|
    |StyleSheet|MptwTheme##StyleSheet|
    |PageTemplate|##PageTemplate|

    !PageTemplate
    <!--{{{-->

    <!-- horizontal MainMenu -->
    <div id='topMenu' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
    <span refresh='content' tiddler='SiteTitle' style="padding-left:1em;font-weight:bold;"></span>:
    <span refresh='content' tiddler='MainMenu'></span>
    </div>
    <div id='sidebar'>
    	<div id='sidebarOptions'>
    		<div refresh='content' tiddler='SideBarOptions'></div>
    		<div style="margin-left:0.1em;"
    			macro='slider chkTabSliderPanel SideBarTabs {{"tabs \u00bb"}} "Show Timeline, All, Tags, etc"'></div>
    	</div>
    </div>
    <div id='displayArea'>
    	<div id='messageArea'></div>
    	<div id='tiddlerDisplay'></div>
    </div>

    For upgrading. See [[ImportTiddlers]].
    URL: http://mptw.tiddlyspot.com/upgrade.html

    /***
    |Description:|A place to put your config tweaks so they aren't overwritten when you upgrade MPTW|
    See http://www.tiddlywiki.org/wiki/Configuration_Options for other options you can set. In some cases where there are clashes with other plugins it might help to rename this to zzMptwUserConfigPlugin so it gets executed last.
    ***/
    //{{{

    // example: set your preferred date format
    //config.mptwDateFormat = 'MM/0DD/YY';
    //config.mptwJournalFormat = 'Journal MM/0DD/YY';

    // example: set the theme you want to start with
    //config.options.txtTheme = 'MptwRoundTheme';

    // example: switch off autosave, switch on backups and set a backup folder
    //config.options.chkSaveBackups = true;
    //config.options.chkAutoSave = false;
    //config.options.txtBackupFolder = 'backups';

    // uncomment to disable 'new means new' functionality for the new journal macro
    //config.newMeansNewForJournalsToo = false;

    //}}}

    /***
    |Name:|NewHerePlugin|
    |Description:|Creates the new here and new journal macros|
    |Version:|3.0 ($Rev: 3861 $)|
    |Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
    |Source:|http://mptw.tiddlyspot.com/#NewHerePlugin|
    |Author:|Simon Baird <simon.baird@gmail.com>|
    |License|http://mptw.tiddlyspot.com/#TheBSDLicense|
    ***/
    //{{{
    merge(config.macros, {
    	newHere: {
    		handler: function(place,macroName,params,wikifier,paramString,tiddler) {
    			wikify("<<newTiddler "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);
    		}
    	},
    	newJournalHere: {
    		handler: function(place,macroName,params,wikifier,paramString,tiddler) {
    			wikify("<<newJournal "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);
    		}
    	}
    });

    //}}}

    /***
    |Name:|NewMeansNewPlugin|
    |Description:|If 'New Tiddler' already exists then create 'New Tiddler (1)' and so on|
    |Version:|1.1.1 ($Rev: 2263 $)|
    |Date:|$Date: 2007-06-13 04:22:32 +1000 (Wed, 13 Jun 2007) $|
    |Source:|http://mptw.tiddlyspot.com/empty.html#NewMeansNewPlugin|
    |Author:|Simon Baird <simon.baird@gmail.com>|
    |License|http://mptw.tiddlyspot.com/#TheBSDLicense|
    !!Note: I think this should be in the core
    ***/
    //{{{

    // change this or set config.newMeansNewForJournalsToo it in MptwUuserConfigPlugin
    if (config.newMeansNewForJournalsToo == undefined) config.newMeansNewForJournalsToo = true;

    String.prototype.getNextFreeName = function() {
           var numberRegExp = / \(([0-9]+)\)$/;
           var match = numberRegExp.exec(this);
           if (match) {
                   var num = parseInt(match[1]) + 1;
                   return this.replace(numberRegExp," ("+num+")");
           }
           else {
                   return this + " (1)";
           }
    }

    config.macros.newTiddler.checkForUnsaved = function(newName) {
    	var r = false;
    	story.forEachTiddler(function(title,element) {
    		if (title == newName)
    			r = true;
    	});
    	return r;
    }

    config.macros.newTiddler.getName = function(newName) {
           while (store.getTiddler(newName) || config.macros.newTiddler.checkForUnsaved(newName))
                   newName = newName.getNextFreeName();
           return newName;
    }

    config.macros.newTiddler.onClickNewTiddler = function()
    {
    	var title = this.getAttribute("newTitle");
    	if(this.getAttribute("isJournal") == "true") {
    		title = new Date().formatString(title.trim());
    	}

    	// ---- these three lines should be the only difference between this and the core onClickNewTiddler
    	if (config.newMeansNewForJournalsToo || this.getAttribute("isJournal") != "true")
    		title = config.macros.newTiddler.getName(title);

    	var params = this.getAttribute("params");
    	var tags = params ? params.split("|") : [];
    	var focus = this.getAttribute("newFocus");
    	var template = this.getAttribute("newTemplate");
    	var customFields = this.getAttribute("customFields");
    	if(!customFields && !store.isShadowTiddler(title))
    		customFields = String.encodeHashMap(config.defaultCustomFields);
    	story.displayTiddler(null,title,template,false,null,null);
    	var tiddlerElem = story.getTiddler(title);
    	if(customFields)
    		story.addCustomFields(tiddlerElem,customFields);
    	var text = this.getAttribute("newText");
    	if(typeof text == "string")
    		story.getTiddlerField(title,"text").value = text.format([title]);
    	for(var t=0;t<tags.length;t++)
    		story.setTiddlerTag(title,tags[t],+1);
    	story.focusTiddler(title,focus);
    	return false;
    };

    //}}}

    /***
    |Name:|PrettyDatesPlugin|
    |Description:|Provides a new date format ('pppp') that displays times such as '2 days ago'|
    |Version:|1.0 ($Rev: 3646 $)|
    |Date:|$Date: 2008-02-27 02:34:38 +1000 (Wed, 27 Feb 2008) $|
    |Source:|http://mptw.tiddlyspot.com/#PrettyDatesPlugin|
    |Author:|Simon Baird <simon.baird@gmail.com>|
    |License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
    !!Notes
    * If you want to you can rename this plugin. :) Some suggestions: LastUpdatedPlugin, RelativeDatesPlugin, SmartDatesPlugin, SexyDatesPlugin.
    * Inspired by http://ejohn.org/files/pretty.js
    ***/
    //{{{
    Date.prototype.prettyDate = function() {
    	var diff = (((new Date()).getTime() - this.getTime()) / 1000);
    	var day_diff = Math.floor(diff / 86400);

    	if (isNaN(day_diff))      return "";
    	else if (diff < 0)        return "in the future";
    	else if (diff < 60)       return "just now";
    	else if (diff < 120)      return "1 minute ago";
    	else if (diff < 3600)     return Math.floor(diff/60) + " minutes ago";
    	else if (diff < 7200)     return "1 hour ago";
    	else if (diff < 86400)    return Math.floor(diff/3600) + " hours ago";
    	else if (day_diff == 1)   return "Yesterday";
    	else if (day_diff < 7)    return day_diff + " days ago";
    	else if (day_diff < 14)   return  "a week ago";
    	else if (day_diff < 31)   return Math.ceil(day_diff/7) + " weeks ago";
    	else if (day_diff < 62)   return "a month ago";
    	else if (day_diff < 365)  return "about " + Math.ceil(day_diff/31) + " months ago";
    	else if (day_diff < 730)  return "a year ago";
    	else                      return Math.ceil(day_diff/365) + " years ago";
    }

    Date.prototype.formatString_orig_mptw = Date.prototype.formatString;

    Date.prototype.formatString = function(template) {
    	return this.formatString_orig_mptw(template).replace(/pppp/,this.prettyDate());
    }

    // for MPTW. otherwise edit your ViewTemplate as required.
    // config.mptwDateFormat = 'pppp (DD/MM/YY)';
    config.mptwDateFormat = 'pppp';

    //}}}

    /***
    |Name:|QuickOpenTagPlugin|
    |Description:|Changes tag links to make it easier to open tags as tiddlers|
    |Version:|3.0.1 ($Rev: 3861 $)|
    |Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
    |Source:|http://mptw.tiddlyspot.com/#QuickOpenTagPlugin|
    |Author:|Simon Baird <simon.baird@gmail.com>|
    |License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
    ***/
    //{{{
    config.quickOpenTag = {

    	dropdownChar: (document.all ? "\u25bc" : "\u25be"), // the little one doesn't work in IE?

    	createTagButton: function(place,tag,excludeTiddler) {
    		// little hack so we can do this: <<tag PrettyTagName|RealTagName>>
    		var splitTag = tag.split("|");
    		var pretty = tag;
    		if (splitTag.length == 2) {
    			tag = splitTag[1];
    			pretty = splitTag[0];
    		}

    		var sp = createTiddlyElement(place,"span",null,"quickopentag");
    		createTiddlyText(createTiddlyLink(sp,tag,false),pretty);

    		var theTag = createTiddlyButton(sp,config.quickOpenTag.dropdownChar,
                            config.views.wikified.tag.tooltip.format([tag]),onClickTag);
    		theTag.setAttribute("tag",tag);
    		if (excludeTiddler)
    			theTag.setAttribute("tiddler",excludeTiddler);
        		return(theTag);
    	},

    	miniTagHandler: function(place,macroName,params,wikifier,paramString,tiddler) {
    		var tagged = store.getTaggedTiddlers(tiddler.title);
    		if (tagged.length > 0) {
    			var theTag = createTiddlyButton(place,config.quickOpenTag.dropdownChar,
                            	config.views.wikified.tag.tooltip.format([tiddler.title]),onClickTag);
    			theTag.setAttribute("tag",tiddler.title);
    			theTag.className = "miniTag";
    		}
    	},

    	allTagsHandler: function(place,macroName,params) {
    		var tags = store.getTags(params[0]);
    		var filter = params[1]; // new feature
    		var ul = createTiddlyElement(place,"ul");
    		if(tags.length == 0)
    			createTiddlyElement(ul,"li",null,"listTitle",this.noTags);
    		for(var t=0; t<tags.length; t++) {
    			var title = tags[t][0];
    			if (!filter || (title.match(new RegExp('^'+filter)))) {
    				var info = getTiddlyLinkInfo(title);
    				var theListItem =createTiddlyElement(ul,"li");
    				var theLink = createTiddlyLink(theListItem,tags[t][0],true);
    				var theCount = " (" + tags[t][1] + ")";
    				theLink.appendChild(document.createTextNode(theCount));
    				var theDropDownBtn = createTiddlyButton(theListItem," " +
    					config.quickOpenTag.dropdownChar,this.tooltip.format([tags[t][0]]),onClickTag);
    				theDropDownBtn.setAttribute("tag",tags[t][0]);
    			}
    		}
    	},

    	// todo fix these up a bit
    	styles: [
    "/*{{{*/",
    "/* created by QuickOpenTagPlugin */",
    ".tagglyTagged .quickopentag, .tagged .quickopentag ",
    "	{ margin-right:1.2em; border:1px solid #eee; padding:2px; padding-right:0px; padding-left:1px; }",
    ".quickopentag .tiddlyLink { padding:2px; padding-left:3px; }",
    ".quickopentag a.button { padding:1px; padding-left:2px; padding-right:2px;}",
    "/* extra specificity to make it work right */",
    "#displayArea .viewer .quickopentag a.button, ",
    "#displayArea .viewer .quickopentag a.tiddyLink, ",
    "#mainMenu .quickopentag a.tiddyLink, ",
    "#mainMenu .quickopentag a.tiddyLink ",
    "	{ border:0px solid black; }",
    "#displayArea .viewer .quickopentag a.button, ",
    "#mainMenu .quickopentag a.button ",
    "	{ margin-left:0px; padding-left:2px; }",
    "#displayArea .viewer .quickopentag a.tiddlyLink, ",
    "#mainMenu .quickopentag a.tiddlyLink ",
    "	{ margin-right:0px; padding-right:0px; padding-left:0px; margin-left:0px; }",
    "a.miniTag {font-size:150%;} ",
    "#mainMenu .quickopentag a.button ",
    "	/* looks better in right justified main menus */",
    "	{ margin-left:0px; padding-left:2px; margin-right:0px; padding-right:0px; }",
    "#topMenu .quickopentag { padding:0px; margin:0px; border:0px; }",
    "#topMenu .quickopentag .tiddlyLink { padding-right:1px; margin-right:0px; }",
    "#topMenu .quickopentag .button { padding-left:1px; margin-left:0px; border:0px; }",
    "/*}}}*/",
    		""].join("\n"),

    	init: function() {
    		// we fully replace these builtins. can't hijack them easily
    		window.createTagButton = this.createTagButton;
    		config.macros.allTags.handler = this.allTagsHandler;
    		config.macros.miniTag = { handler: this.miniTagHandler };
    		config.shadowTiddlers["QuickOpenTagStyles"] = this.styles;
    		store.addNotification("QuickOpenTagStyles",refreshStyles);
    	}
    }

    config.quickOpenTag.init();

    //}}}

    FreeCAD - 0.9
    =============

    Targeted mainly towards the Debian integration

    - 0000035: [Feature] Change placement behavior (wmayer) - closed.
    - 0000036: [Bug] Chnge angle parameters in Part to degree (Jriegel) - closed.
    - 0000006: [Feature] Part interface cleanup (Jriegel) - closed.
     - 0000004: [Feature] Subelement link property (Jriegel) - closed.
    - 0000033: [Feature] Better rotation operations on Placement (wmayer) - closed.
    - 0000002: [Bug] Error in Start_Page.html (Jriegel) - closed.
    - 0000010: [Bug] pivy does not work and leads to runtime failures (wmayer) - closed.
    - 0000030: [Feature] Clean up Raytracing (Jriegel) - closed.
    - 0000022: [Feature] Robot simulation Workbench (Jriegel) - closed.
     - 0000023: [Feature] Robot object & Grafik representation (Jriegel) - closed.
     - 0000024: [Feature] Robot inverse kinematic for a Kuka IR500 (Jriegel) - closed.
    - 0000007: [Bug] Help file cannot be opened (wmayer) - closed.

    To get a complete overview see the issue tracker on our web site: http://sourceforge.net/apps/mantisbt/free-cad/my_view_page.php

    /***
    |Name:|RenameTagsPlugin|
    |Description:|Allows you to easily rename or delete tags across multiple tiddlers|
    |Version:|3.0 ($Rev: 5501 $)|
    |Date:|$Date: 2008-06-10 23:11:55 +1000 (Tue, 10 Jun 2008) $|
    |Source:|http://mptw.tiddlyspot.com/#RenameTagsPlugin|
    |Author:|Simon Baird <simon.baird@gmail.com>|
    |License|http://mptw.tiddlyspot.com/#TheBSDLicense|
    Rename a tag and you will be prompted to rename it in all its tagged tiddlers.
    ***/
    //{{{
    config.renameTags = {

    	prompts: {
    		rename: "Rename the tag '%0' to '%1' in %2 tidder%3?",
    		remove: "Remove the tag '%0' from %1 tidder%2?"
    	},

    	removeTag: function(tag,tiddlers) {
    		store.suspendNotifications();
    		for (var i=0;i<tiddlers.length;i++) {
    			store.setTiddlerTag(tiddlers[i].title,false,tag);
    		}
    		store.resumeNotifications();
    		store.notifyAll();
    	},

    	renameTag: function(oldTag,newTag,tiddlers) {
    		store.suspendNotifications();
    		for (var i=0;i<tiddlers.length;i++) {
    			store.setTiddlerTag(tiddlers[i].title,false,oldTag); // remove old
    			store.setTiddlerTag(tiddlers[i].title,true,newTag);  // add new
    		}
    		store.resumeNotifications();
    		store.notifyAll();
    	},

    	storeMethods: {

    		saveTiddler_orig_renameTags: TiddlyWiki.prototype.saveTiddler,

    		saveTiddler: function(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created) {
    			if (title != newTitle) {
    				var tagged = this.getTaggedTiddlers(title);
    				if (tagged.length > 0) {
    					// then we are renaming a tag
    					if (confirm(config.renameTags.prompts.rename.format([title,newTitle,tagged.length,tagged.length>1?"s":""])))
    						config.renameTags.renameTag(title,newTitle,tagged);

    					if (!this.tiddlerExists(title) && newBody == "")
    						// dont create unwanted tiddler
    						return null;
    				}
    			}
    			return this.saveTiddler_orig_renameTags(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created);
    		},

    		removeTiddler_orig_renameTags: TiddlyWiki.prototype.removeTiddler,

    		removeTiddler: function(title) {
    			var tagged = this.getTaggedTiddlers(title);
    			if (tagged.length > 0)
    				if (confirm(config.renameTags.prompts.remove.format([title,tagged.length,tagged.length>1?"s":""])))
    					config.renameTags.removeTag(title,tagged);
    			return this.removeTiddler_orig_renameTags(title);
    		}

    	},

    	init: function() {
    		merge(TiddlyWiki.prototype,this.storeMethods);
    	}
    }

    config.renameTags.init();

    //}}}

    /***
    |Name:|SaveCloseTiddlerPlugin|
    |Description:|Provides two extra toolbar commands, saveCloseTiddler and cancelCloseTiddler|
    |Version:|3.0 ($Rev: 5502 $)|
    |Date:|$Date: 2008-06-10 23:31:39 +1000 (Tue, 10 Jun 2008) $|
    |Source:|http://mptw.tiddlyspot.com/#SaveCloseTiddlerPlugin|
    |Author:|Simon Baird <simon.baird@gmail.com>|
    |License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
    To use these you must add them to the tool bar in your EditTemplate
    ***/
    //{{{
    merge(config.commands,{

    	saveCloseTiddler: {
    		text: 'done/close',
    		tooltip: 'Save changes to this tiddler and close it',
    		handler: function(ev,src,title) {
    			var closeTitle = title;
    			var newTitle = story.saveTiddler(title,ev.shiftKey);
    			if (newTitle)
    				closeTitle = newTitle;
    			return config.commands.closeTiddler.handler(ev,src,closeTitle);
    		}
    	},

    	cancelCloseTiddler: {
    		text: 'cancel/close',
    		tooltip: 'Undo changes to this tiddler and close it',
    		handler: function(ev,src,title) {
    			// the same as closeTiddler now actually
    			return config.commands.closeTiddler.handler(ev,src,title);
    		}
    	}

    });

    //}}}

    /***
    |Name:|SelectThemePlugin|
    |Description:|Lets you easily switch theme and palette|
    |Version:|1.0.1 ($Rev: 3646 $)|
    |Date:|$Date: 2008-02-27 02:34:38 +1000 (Wed, 27 Feb 2008) $|
    |Source:|http://mptw.tiddlyspot.com/#SelectThemePlugin|
    |Author:|Simon Baird <simon.baird@gmail.com>|
    |License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
    !Notes
    * Borrows largely from ThemeSwitcherPlugin by Martin Budden http://www.martinswiki.com/#ThemeSwitcherPlugin
    * Theme is cookie based. But set a default by setting config.options.txtTheme in MptwConfigPlugin (for example)
    * Palette is not cookie based. It actually overwrites your ColorPalette tiddler when you select a palette, so beware.
    !Usage
    * {{{<<selectTheme>>}}} makes a dropdown selector
    * {{{<<selectPalette>>}}} makes a dropdown selector
    * {{{<<applyTheme>>}}} applies the current tiddler as a theme
    * {{{<<applyPalette>>}}} applies the current tiddler as a palette
    * {{{<<applyTheme TiddlerName>>}}} applies TiddlerName as a theme
    * {{{<<applyPalette TiddlerName>>}}} applies TiddlerName as a palette
    ***/
    //{{{

    config.macros.selectTheme = {
    	label: {
          		selectTheme:"select theme",
          		selectPalette:"select palette"
    	},
    	prompt: {
    		selectTheme:"Select the current theme",
    		selectPalette:"Select the current palette"
    	},
    	tags: {
    		selectTheme:'systemTheme',
    		selectPalette:'systemPalette'
    	}
    };

    config.macros.selectTheme.handler = function(place,macroName)
    {
    	var btn = createTiddlyButton(place,this.label[macroName],this.prompt[macroName],this.onClick);
    	// want to handle palettes and themes with same code. use mode attribute to distinguish
    	btn.setAttribute('mode',macroName);
    };

    config.macros.selectTheme.onClick = function(ev)
    {
    	var e = ev ? ev : window.event;
    	var popup = Popup.create(this);
    	var mode = this.getAttribute('mode');
    	var tiddlers = store.getTaggedTiddlers(config.macros.selectTheme.tags[mode]);
    	// for default
    	if (mode == "selectPalette") {
    		var btn = createTiddlyButton(createTiddlyElement(popup,'li'),"(default)","default color palette",config.macros.selectTheme.onClickTheme);
    		btn.setAttribute('theme',"(default)");
    		btn.setAttribute('mode',mode);
    	}
    	for(var i=0; i<tiddlers.length; i++) {
    		var t = tiddlers[i].title;
    		var name = store.getTiddlerSlice(t,'Name');
    		var desc = store.getTiddlerSlice(t,'Description');
    		var btn = createTiddlyButton(createTiddlyElement(popup,'li'), name?name:t, desc?desc:config.macros.selectTheme.label['mode'], config.macros.selectTheme.onClickTheme);
    		btn.setAttribute('theme',t);
    		btn.setAttribute('mode',mode);
    	}
    	Popup.show();
    	return stopEvent(e);
    };

    config.macros.selectTheme.onClickTheme = function(ev)
    {
    	var mode = this.getAttribute('mode');
    	var theme = this.getAttribute('theme');
    	if (mode == 'selectTheme')
    		story.switchTheme(theme);
    	else // selectPalette
    		config.macros.selectTheme.updatePalette(theme);
    	return false;
    };

    config.macros.selectTheme.updatePalette = function(title)
    {
    	if (title != "") {
    		store.deleteTiddler("ColorPalette");
    		if (title != "(default)")
    			store.saveTiddler("ColorPalette","ColorPalette",store.getTiddlerText(title),
    					config.options.txtUserName,undefined,"");
    		refreshAll();
    		if(config.options.chkAutoSave)
    			saveChanges(true);
    	}
    };

    config.macros.applyTheme = {
    	label: "apply",
    	prompt: "apply this theme or palette" // i'm lazy
    };

    config.macros.applyTheme.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
    	var useTiddler = params[0] ? params[0] : tiddler.title;
    	var btn = createTiddlyButton(place,this.label,this.prompt,config.macros.selectTheme.onClickTheme);
    	btn.setAttribute('theme',useTiddler);
    	btn.setAttribute('mode',macroName=="applyTheme"?"selectTheme":"selectPalette"); // a bit untidy here
    }

    config.macros.selectPalette = config.macros.selectTheme;
    config.macros.applyPalette = config.macros.applyTheme;

    config.macros.refreshAll = { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
    	createTiddlyButton(place,"refresh","refresh layout and styles",function() { refreshAll(); });
    }};

    //}}}

    free your design

    Welcome to FreeCAD 0.9!

    <<allTags excludeLists>>

    <<tabs txtMoreTab "Tags" "All Tags" TabAllTags "Miss" "Missing tiddlers" TabMoreMissing "Orph" "Orphaned tiddlers" TabMoreOrphans "Shad" "Shadowed tiddlers" TabMoreShadowed>>

    <<allTags excludeLists [a-z]>>

    /***
    |Name:|TagglyTaggingPlugin|
    |Description:|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|
    |Version:|3.3.1 ($Rev: 9828 $)|
    |Date:|$Date: 2009-06-03 21:38:41 +1000 (Wed, 03 Jun 2009) $|
    |Source:|http://mptw.tiddlyspot.com/#TagglyTaggingPlugin|
    |Author:|Simon Baird <simon.baird@gmail.com>|
    |License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
    !Notes
    See http://mptw.tiddlyspot.com/#TagglyTagging
    ***/
    //{{{

    merge(String.prototype,{

    	parseTagExpr: function(debug) {

    		if (this.trim() == "")
    			return "(true)";

    		var anyLogicOp = /(!|&&|\|\||\(|\))/g;
    		var singleLogicOp = /^(!|&&|\|\||\(|\))$/;

    		var spaced = this.
    			// because square brackets in templates are no good
    			// this means you can use [(With Spaces)] instead of [[With Spaces]]
    			replace(/\[\(/g," [[").
    			replace(/\)\]/g,"]] ").
    			// space things out so we can use readBracketedList. tricky eh?
    			replace(anyLogicOp," $1 ");

    		var expr = "";

    		var tokens = spaced.readBracketedList(false); // false means don't uniq the list. nice one JR!

    		for (var i=0;i<tokens.length;i++)
    			if (tokens[i].match(singleLogicOp))
    				expr += tokens[i];
    			else
    				expr += "tiddler.tags.contains('%0')".format([tokens[i].replace(/'/,"\\'")]); // fix single quote bug. still have round bracket bug i think

    		if (debug)
    			alert(expr);

    		return '('+expr+')';
    	}

    });

    merge(TiddlyWiki.prototype,{
    	getTiddlersByTagExpr: function(tagExpr,sortField) {

    		var result = [];

    		var expr = tagExpr.parseTagExpr();

    		store.forEachTiddler(function(title,tiddler) {
    			if (eval(expr))
    				result.push(tiddler);
    		});

    		if(!sortField)
    			sortField = "title";

    		result.sort(function(a,b) {return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);});

    		return result;
    	}
    });

    config.taggly = {

    	// for translations
    	lingo: {
    		labels: {
    			asc:        "\u2191", // down arrow
    			desc:       "\u2193", // up arrow
    			title:      "title",
    			modified:   "modified",
    			created:    "created",
    			show:       "+",
    			hide:       "-",
    			normal:     "normal",
    			group:      "group",
    			commas:     "commas",
    			sitemap:    "sitemap",
    			numCols:    "cols\u00b1", // plus minus sign
    			label:      "Tagged as '%0':",
    			exprLabel:  "Matching tag expression '%0':",
    			excerpts:   "excerpts",
    			descr:      "descr",
    			slices:     "slices",
    			contents:   "contents",
    			sliders:    "sliders",
    			noexcerpts: "title only",
    			noneFound:  "(none)"
    		},

    		tooltips: {
    			title:      "Click to sort by title",
    			modified:   "Click to sort by modified date",
    			created:    "Click to sort by created date",
    			show:       "Click to show tagging list",
    			hide:       "Click to hide tagging list",
    			normal:     "Click to show a normal ungrouped list",
    			group:      "Click to show list grouped by tag",
    			sitemap:    "Click to show a sitemap style list",
    			commas:     "Click to show a comma separated list",
    			numCols:    "Click to change number of columns",
    			excerpts:   "Click to show excerpts",
    			descr:      "Click to show the description slice",
    			slices:     "Click to show all slices",
    			contents:   "Click to show entire tiddler contents",
    			sliders:    "Click to show tiddler contents in sliders",
    			noexcerpts: "Click to show entire title only"
    		},

    		tooDeepMessage: "* //sitemap too deep...//"
    	},

    	config: {
    		showTaggingCounts: true,
    		listOpts: {
    			// the first one will be the default
    			sortBy:     ["title","modified","created"],
    			sortOrder:  ["asc","desc"],
    			hideState:  ["show","hide"],
    			listMode:   ["normal","group","sitemap","commas"],
    			numCols:    ["1","2","3","4","5","6"],
    			excerpts:   ["noexcerpts","excerpts","descr","slices","contents","sliders"]
    		},
    		valuePrefix: "taggly.",
    		excludeTags: ["excludeLists","excludeTagging"],
    		excerptSize: 50,
    		excerptMarker: "/%"+"%/",
    		siteMapDepthLimit: 25
    	},

    	getTagglyOpt: function(title,opt) {
    		var val = store.getValue(title,this.config.valuePrefix+opt);
    		return val ? val : this.config.listOpts[opt][0];
    	},

    	setTagglyOpt: function(title,opt,value) {
    		// create it silently if it doesn't exist
    		if (!store.tiddlerExists(title)) {
    			store.saveTiddler(title,title,config.views.editor.defaultText.format([title]),config.options.txtUserName,new Date(),"");

    			// <<tagglyTagging expr:"...">> creates a tiddler to store its display settings
    			// Make those tiddlers less noticeable by tagging as excludeSearch and excludeLists
    			// Because we don't want to hide real tags, check that they aren't actually tags before doing so
    			// Also tag them as tagglyExpression for manageability
    			// (contributed by RA)
    			if (!store.getTaggedTiddlers(title).length) {
    				store.setTiddlerTag(title,true,"excludeSearch");
    				store.setTiddlerTag(title,true,"excludeLists");
    				store.setTiddlerTag(title,true,"tagglyExpression");
    			}
    		}

    		// if value is default then remove it to save space
    		return store.setValue(title, this.config.valuePrefix+opt, value == this.config.listOpts[opt][0] ? null : value);
    	},

    	getNextValue: function(title,opt) {
    		var current = this.getTagglyOpt(title,opt);
    		var pos = this.config.listOpts[opt].indexOf(current);
    		// supposed to automagically don't let cols cycle up past the number of items
    		// currently broken in some situations, eg when using an expression
    		// lets fix it later when we rewrite for jquery
    		// the columns thing should be jquery table manipulation probably
    		var limit = (opt == "numCols" ? store.getTaggedTiddlers(title).length : this.config.listOpts[opt].length);
    		var newPos = (pos + 1) % limit;
    		return this.config.listOpts[opt][newPos];
    	},

    	toggleTagglyOpt: function(title,opt) {
    		var newVal = this.getNextValue(title,opt);
    		this.setTagglyOpt(title,opt,newVal);
    	},

    	createListControl: function(place,title,type) {
    		var lingo = config.taggly.lingo;
    		var label;
    		var tooltip;
    		var onclick;

    		if ((type == "title" || type == "modified" || type == "created")) {
    			// "special" controls. a little tricky. derived from sortOrder and sortBy
    			label = lingo.labels[type];
    			tooltip = lingo.tooltips[type];

    			if (this.getTagglyOpt(title,"sortBy") == type) {
    				label += lingo.labels[this.getTagglyOpt(title,"sortOrder")];
    				onclick = function() {
    					config.taggly.toggleTagglyOpt(title,"sortOrder");
    					return false;
    				}
    			}
    			else {
    				onclick = function() {
    					config.taggly.setTagglyOpt(title,"sortBy",type);
    					config.taggly.setTagglyOpt(title,"sortOrder",config.taggly.config.listOpts.sortOrder[0]);
    					return false;
    				}
    			}
    		}
    		else {
    			// "regular" controls, nice and simple
    			label = lingo.labels[type == "numCols" ? type : this.getNextValue(title,type)];
    			tooltip = lingo.tooltips[type == "numCols" ? type : this.getNextValue(title,type)];
    			onclick = function() {
    				config.taggly.toggleTagglyOpt(title,type);
    				return false;
    			}
    		}

    		// hide button because commas don't have columns
    		if (!(this.getTagglyOpt(title,"listMode") == "commas" && type == "numCols"))
    			createTiddlyButton(place,label,tooltip,onclick,type == "hideState" ? "hidebutton" : "button");
    	},

    	makeColumns: function(orig,numCols) {
    		var listSize = orig.length;
    		var colSize = listSize/numCols;
    		var remainder = listSize % numCols;

    		var upperColsize = colSize;
    		var lowerColsize = colSize;

    		if (colSize != Math.floor(colSize)) {
    			// it's not an exact fit so..
    			upperColsize = Math.floor(colSize) + 1;
    			lowerColsize = Math.floor(colSize);
    		}

    		var output = [];
    		var c = 0;
    		for (var j=0;j<numCols;j++) {
    			var singleCol = [];
    			var thisSize = j < remainder ? upperColsize : lowerColsize;
    			for (var i=0;i<thisSize;i++)
    				singleCol.push(orig[c++]);
    			output.push(singleCol);
    		}

    		return output;
    	},

    	drawTable: function(place,columns,theClass) {
    		var newTable = createTiddlyElement(place,"table",null,theClass);
    		var newTbody = createTiddlyElement(newTable,"tbody");
    		var newTr = createTiddlyElement(newTbody,"tr");
    		for (var j=0;j<columns.length;j++) {
    			var colOutput = "";
    			for (var i=0;i<columns[j].length;i++)
    				colOutput += columns[j][i];
    			var newTd = createTiddlyElement(newTr,"td",null,"tagglyTagging"); // todo should not need this class
    			wikify(colOutput,newTd);
    		}
    		return newTable;
    	},

    	createTagglyList: function(place,title,isTagExpr) {
    		switch(this.getTagglyOpt(title,"listMode")) {
    			case "group":  return this.createTagglyListGrouped(place,title,isTagExpr); break;
    			case "normal": return this.createTagglyListNormal(place,title,false,isTagExpr); break;
    			case "commas": return this.createTagglyListNormal(place,title,true,isTagExpr); break;
    			case "sitemap":return this.createTagglyListSiteMap(place,title,isTagExpr); break;
    		}
    	},

    	getTaggingCount: function(title,isTagExpr) {
    		// thanks to Doug Edmunds
    		if (this.config.showTaggingCounts) {
    			var tagCount = config.taggly.getTiddlers(title,'title',isTagExpr).length;
    			if (tagCount > 0)
    				return " ("+tagCount+")";
    		}
    		return "";
    	},

    	getTiddlers: function(titleOrExpr,sortBy,isTagExpr) {
    		return isTagExpr ? store.getTiddlersByTagExpr(titleOrExpr,sortBy) : store.getTaggedTiddlers(titleOrExpr,sortBy);
    	},

    	getExcerpt: function(inTiddlerTitle,title,indent) {
    		if (!indent)
    			indent = 1;

    		var displayMode = this.getTagglyOpt(inTiddlerTitle,"excerpts");
    		var t = store.getTiddler(title);

    		if (t && displayMode == "excerpts") {
    			var text = t.text.replace(/\n/," ");
    			var marker = text.indexOf(this.config.excerptMarker);
    			if (marker != -1) {
    				return " {{excerpt{<nowiki>" + text.substr(0,marker) + "</nowiki>}}}";
    			}
    			else if (text.length < this.config.excerptSize) {
    				return " {{excerpt{<nowiki>" + t.text + "</nowiki>}}}";
    			}
    			else {
    				return " {{excerpt{<nowiki>" + t.text.substr(0,this.config.excerptSize) + "..." + "</nowiki>}}}";
    			}
    		}
    		else if (t && displayMode == "contents") {
    			return "\n{{contents indent"+indent+"{\n" + t.text + "\n}}}";
    		}
    		else if (t && displayMode == "sliders") {
    			return "<slider slide>\n{{contents{\n" + t.text + "\n}}}\n</slider>";
    		}
    		else if (t && displayMode == "descr") {
    			var descr = store.getTiddlerSlice(title,'Description');
    			return descr ? " {{excerpt{" + descr  + "}}}" : "";
    		}
    		else if (t && displayMode == "slices") {
    			var result = "";
    			var slices = store.calcAllSlices(title);
    			for (var s in slices)
    				result += "|%0|<nowiki>%1</nowiki>|\n".format([s,slices[s]]);
    			return result ? "\n{{excerpt excerptIndent{\n" + result  + "}}}" : "";
    		}
    		return "";
    	},

    	notHidden: function(t,inTiddler) {
    		if (typeof t == "string")
    			t = store.getTiddler(t);
    		return (!t || !t.tags.containsAny(this.config.excludeTags) ||
    				(inTiddler && this.config.excludeTags.contains(inTiddler)));
    	},

    	// this is for normal and commas mode
    	createTagglyListNormal: function(place,title,useCommas,isTagExpr) {

    		var list = config.taggly.getTiddlers(title,this.getTagglyOpt(title,"sortBy"),isTagExpr);

    		if (this.getTagglyOpt(title,"sortOrder") == "desc")
    			list = list.reverse();

    		var output = [];
    		var first = true;
    		for (var i=0;i<list.length;i++) {
    			if (this.notHidden(list[i],title)) {
    				var countString = this.getTaggingCount(list[i].title);
    				var excerpt = this.getExcerpt(title,list[i].title);
    				if (useCommas)
    					output.push((first ? "" : ", ") + "[[" + list[i].title + "]]" + countString + excerpt);
    				else
    					output.push("*[[" + list[i].title + "]]" + countString + excerpt + "\n");

    				first = false;
    			}
    		}

    		return this.drawTable(place,
    			this.makeColumns(output,useCommas ? 1 : parseInt(this.getTagglyOpt(title,"numCols"))),
    			useCommas ? "commas" : "normal");
    	},

    	// this is for the "grouped" mode
    	createTagglyListGrouped: function(place,title,isTagExpr) {
    		var sortBy = this.getTagglyOpt(title,"sortBy");
    		var sortOrder = this.getTagglyOpt(title,"sortOrder");

    		var list = config.taggly.getTiddlers(title,sortBy,isTagExpr);

    		if (sortOrder == "desc")
    			list = list.reverse();

    		var leftOvers = []
    		for (var i=0;i<list.length;i++)
    			leftOvers.push(list[i].title);

    		var allTagsHolder = {};
    		for (var i=0;i<list.length;i++) {
    			for (var j=0;j<list[i].tags.length;j++) {

    				if (list[i].tags[j] != title) { // not this tiddler

    					if (this.notHidden(list[i].tags[j],title)) {

    						if (!allTagsHolder[list[i].tags[j]])
    							allTagsHolder[list[i].tags[j]] = "";

    						if (this.notHidden(list[i],title)) {
    							allTagsHolder[list[i].tags[j]] += "**[["+list[i].title+"]]"
    										+ this.getTaggingCount(list[i].title) + this.getExcerpt(title,list[i].title) + "\n";

    							leftOvers.setItem(list[i].title,-1); // remove from leftovers. at the end it will contain the leftovers

    						}
    					}
    				}
    			}
    		}

    		var allTags = [];
    		for (var t in allTagsHolder)
    			allTags.push(t);

    		var sortHelper = function(a,b) {
    			if (a == b) return 0;
    			if (a < b) return -1;
    			return 1;
    		};

    		allTags.sort(function(a,b) {
    			var tidA = store.getTiddler(a);
    			var tidB = store.getTiddler(b);
    			if (sortBy == "title") return sortHelper(a,b);
    			else if (!tidA && !tidB) return 0;
    			else if (!tidA) return -1;
    			else if (!tidB) return +1;
    			else return sortHelper(tidA[sortBy],tidB[sortBy]);
    		});

    		var leftOverOutput = "";
    		for (var i=0;i<leftOvers.length;i++)
    			if (this.notHidden(leftOvers[i],title))
    				leftOverOutput += "*[["+leftOvers[i]+"]]" + this.getTaggingCount(leftOvers[i]) + this.getExcerpt(title,leftOvers[i]) + "\n";

    		var output = [];

    		if (sortOrder == "desc")
    			allTags.reverse();
    		else if (leftOverOutput != "")
    			// leftovers first...
    			output.push(leftOverOutput);

    		for (var i=0;i<allTags.length;i++)
    			if (allTagsHolder[allTags[i]] != "")
    				output.push("*[["+allTags[i]+"]]" + this.getTaggingCount(allTags[i]) + this.getExcerpt(title,allTags[i]) + "\n" + allTagsHolder[allTags[i]]);

    		if (sortOrder == "desc" && leftOverOutput != "")
    			// leftovers last...
    			output.push(leftOverOutput);

    		return this.drawTable(place,
    				this.makeColumns(output,parseInt(this.getTagglyOpt(title,"numCols"))),
    				"grouped");

    	},

    	// used to build site map
    	treeTraverse: function(title,depth,sortBy,sortOrder,isTagExpr) {

    		var list = config.taggly.getTiddlers(title,sortBy,isTagExpr);

    		if (sortOrder == "desc")
    			list.reverse();

    		var indent = "";
    		for (var j=0;j<depth;j++)
    			indent += "*"

    		var childOutput = "";

    		if (depth > this.config.siteMapDepthLimit)
    			childOutput += indent + this.lingo.tooDeepMessage;
    		else
    			for (var i=0;i<list.length;i++)
    				if (list[i].title != title)
    					if (this.notHidden(list[i].title,this.config.inTiddler))
    						childOutput += this.treeTraverse(list[i].title,depth+1,sortBy,sortOrder,false);

    		if (depth == 0)
    			return childOutput;
    		else
    			return indent + "[["+title+"]]" + this.getTaggingCount(title) + this.getExcerpt(this.config.inTiddler,title,depth) + "\n" + childOutput;
    	},

    	// this if for the site map mode
    	createTagglyListSiteMap: function(place,title,isTagExpr) {
    		this.config.inTiddler = title; // nasty. should pass it in to traverse probably
    		var output = this.treeTraverse(title,0,this.getTagglyOpt(title,"sortBy"),this.getTagglyOpt(title,"sortOrder"),isTagExpr);
    		return this.drawTable(place,
    				this.makeColumns(output.split(/(?=^\*\[)/m),parseInt(this.getTagglyOpt(title,"numCols"))), // regexp magic
    				"sitemap"
    				);
    	},

    	macros: {
    		tagglyTagging: {
    			handler: function (place,macroName,params,wikifier,paramString,tiddler) {
    				var parsedParams = paramString.parseParams("tag",null,true);
    				var refreshContainer = createTiddlyElement(place,"div");

    				// do some refresh magic to make it keep the list fresh - thanks Saq
    				refreshContainer.setAttribute("refresh","macro");
    				refreshContainer.setAttribute("macroName",macroName);

    				var tag = getParam(parsedParams,"tag");
    				var expr = getParam(parsedParams,"expr");

    				if (expr) {
    					refreshContainer.setAttribute("isTagExpr","true");
    					refreshContainer.setAttribute("title",expr);
    					refreshContainer.setAttribute("showEmpty","true");
    				}
    				else {
    					refreshContainer.setAttribute("isTagExpr","false");
    					if (tag) {
            				refreshContainer.setAttribute("title",tag);
    						refreshContainer.setAttribute("showEmpty","true");
    					}
    					else {
            				refreshContainer.setAttribute("title",tiddler.title);
    						refreshContainer.setAttribute("showEmpty","false");
    					}
    				}
    				this.refresh(refreshContainer);
    			},

    			refresh: function(place) {
    				var title = place.getAttribute("title");
    				var isTagExpr = place.getAttribute("isTagExpr") == "true";
    				var showEmpty = place.getAttribute("showEmpty") == "true";
    				removeChildren(place);
    				addClass(place,"tagglyTagging");
    				var countFound = config.taggly.getTiddlers(title,'title',isTagExpr).length
    				if (countFound > 0 || showEmpty) {
    					var lingo = config.taggly.lingo;
    					config.taggly.createListControl(place,title,"hideState");
    					if (config.taggly.getTagglyOpt(title,"hideState") == "show") {
    						createTiddlyElement(place,"span",null,"tagglyLabel",
    								isTagExpr ? lingo.labels.exprLabel.format([title]) : lingo.labels.label.format([title]));
    						config.taggly.createListControl(place,title,"title");
    						config.taggly.createListControl(place,title,"modified");
    						config.taggly.createListControl(place,title,"created");
    						config.taggly.createListControl(place,title,"listMode");
    						config.taggly.createListControl(place,title,"excerpts");
    						config.taggly.createListControl(place,title,"numCols");
    						config.taggly.createTagglyList(place,title,isTagExpr);
    						if (countFound == 0 && showEmpty)
    							createTiddlyElement(place,"div",null,"tagglyNoneFound",lingo.labels.noneFound);
    					}
    				}
    			}
    		}
    	},

    	// todo fix these up a bit
    	styles: [
    "/*{{{*/",
    "/* created by TagglyTaggingPlugin */",
    ".tagglyTagging { padding-top:0.5em; }",
    ".tagglyTagging li.listTitle { display:none; }",
    ".tagglyTagging ul {",
    "	margin-top:0px; padding-top:0.5em; padding-left:2em;",
    "	margin-bottom:0px; padding-bottom:0px;",
    "}",
    ".tagglyTagging { vertical-align: top; margin:0px; padding:0px; }",
    ".tagglyTagging table { margin:0px; padding:0px; }",
    ".tagglyTagging .button { visibility:hidden; margin-left:3px; margin-right:3px; }",
    ".tagglyTagging .button, .tagglyTagging .hidebutton {",
    "	color:[[ColorPalette::TertiaryLight]]; font-size:90%;",
    "	border:0px; padding-left:0.3em;padding-right:0.3em;",
    "}",
    ".tagglyTagging .button:hover, .hidebutton:hover, ",
    ".tagglyTagging .button:active, .hidebutton:active  {",
    "	border:0px; background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]];",
    "}",
    ".selected .tagglyTagging .button { visibility:visible; }",
    ".tagglyTagging .hidebutton { color:[[ColorPalette::Background]]; }",
    ".selected .tagglyTagging .hidebutton { color:[[ColorPalette::TertiaryLight]] }",
    ".tagglyLabel { color:[[ColorPalette::TertiaryMid]]; font-size:90%; }",
    ".tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }",
    ".tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}",
    ".tagglyTagging ul ul li {margin-left:0.5em; }",
    ".editLabel { font-size:90%; padding-top:0.5em; }",
    ".tagglyTagging .commas { padding-left:1.8em; }",
    "/* not technically tagglytagging but will put them here anyway */",
    ".tagglyTagged li.listTitle { display:none; }",
    ".tagglyTagged li { display: inline; font-size:90%; }",
    ".tagglyTagged ul { margin:0px; padding:0px; }",
    ".excerpt { color:[[ColorPalette::TertiaryDark]]; }",
    ".excerptIndent { margin-left:4em; }",
    "div.tagglyTagging table,",
    "div.tagglyTagging table tr,",
    "td.tagglyTagging",
    " {border-style:none!important; }",
    ".tagglyTagging .contents { border-bottom:2px solid [[ColorPalette::TertiaryPale]]; padding:0 1em 1em 0.5em;",
    "  margin-bottom:0.5em; }",
    ".tagglyTagging .indent1  { margin-left:3em;  }",
    ".tagglyTagging .indent2  { margin-left:4em;  }",
    ".tagglyTagging .indent3  { margin-left:5em;  }",
    ".tagglyTagging .indent4  { margin-left:6em;  }",
    ".tagglyTagging .indent5  { margin-left:7em;  }",
    ".tagglyTagging .indent6  { margin-left:8em;  }",
    ".tagglyTagging .indent7  { margin-left:9em;  }",
    ".tagglyTagging .indent8  { margin-left:10em; }",
    ".tagglyTagging .indent9  { margin-left:11em; }",
    ".tagglyTagging .indent10 { margin-left:12em; }",
    ".tagglyNoneFound { margin-left:2em; color:[[ColorPalette::TertiaryMid]]; font-size:90%; font-style:italic; }",
    "/*}}}*/",
    		""].join("\n"),

    	init: function() {
    		merge(config.macros,this.macros);
    		config.shadowTiddlers["TagglyTaggingStyles"] = this.styles;
    		store.addNotification("TagglyTaggingStyles",refreshStyles);
    	}
    };

    config.taggly.init();

    //}}}

    /***
    InlineSlidersPlugin
    By Saq Imtiaz
    http://tw.lewcid.org/sandbox/#InlineSlidersPlugin

    // syntax adjusted to not clash with NestedSlidersPlugin
    // added + syntax to start open instead of closed

    ***/
    //{{{
    config.formatters.unshift( {
    	name: "inlinesliders",
    	// match: "\\+\\+\\+\\+|\\<slider",
    	match: "\\<slider",
    	// lookaheadRegExp: /(?:\+\+\+\+|<slider) (.*?)(?:>?)\n((?:.|\n)*?)\n(?:====|<\/slider>)/mg,
    	lookaheadRegExp: /(?:<slider)(\+?) (.*?)(?:>)\n((?:.|\n)*?)\n(?:<\/slider>)/mg,
    	handler: function(w) {
    		this.lookaheadRegExp.lastIndex = w.matchStart;
    		var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
    		if(lookaheadMatch && lookaheadMatch.index == w.matchStart ) {
    			var btn = createTiddlyButton(w.output,lookaheadMatch[2] + " "+"\u00BB",lookaheadMatch[2],this.onClickSlider,"button sliderButton");
    			var panel = createTiddlyElement(w.output,"div",null,"sliderPanel");
    			panel.style.display = (lookaheadMatch[1] == '+' ? "block" : "none");
    			wikify(lookaheadMatch[3],panel);
    			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
    		}
       },
       onClickSlider : function(e) {
    		if(!e) var e = window.event;
    		var n = this.nextSibling;
    		n.style.display = (n.style.display=="none") ? "block" : "none";
    		return false;
    	}
    });

    //}}}

    /***
    |Name:|ToggleTagPlugin|
    |Description:|Makes a checkbox which toggles a tag in a tiddler|
    |Version:|3.1.0 ($Rev: 4907 $)|
    |Date:|$Date: 2008-05-13 03:15:46 +1000 (Tue, 13 May 2008) $|
    |Source:|http://mptw.tiddlyspot.com/#ToggleTagPlugin|
    |Author:|Simon Baird <simon.baird@gmail.com>|
    |License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
    !!Usage
    {{{<<toggleTag }}}//{{{TagName TiddlerName LabelText}}}//{{{>>}}}
    * TagName - the tag to be toggled, default value "checked"
    * TiddlerName - the tiddler to toggle the tag in, default value the current tiddler
    * LabelText - the text (gets wikified) to put next to the check box, default value is '{{{[[TagName]]}}}' or '{{{[[TagName]] [[TiddlerName]]}}}'
    (If a parameter is '.' then the default will be used)
    * TouchMod flag - if non empty then touch the tiddlers mod date. Note, can set config.toggleTagAlwaysTouchModDate to always touch mod date
    !!Examples
    |Code|Description|Example|h
    |{{{<<toggleTag>>}}}|Toggles the default tag (checked) in this tiddler|<<toggleTag>>|
    |{{{<<toggleTag TagName>>}}}|Toggles the TagName tag in this tiddler|<<toggleTag TagName>>|
    |{{{<<toggleTag TagName TiddlerName>>}}}|Toggles the TagName tag in the TiddlerName tiddler|<<toggleTag TagName TiddlerName>>|
    |{{{<<toggleTag TagName TiddlerName 'click me'>>}}}|Same but with custom label|<<toggleTag TagName TiddlerName 'click me'>>|
    |{{{<<toggleTag . . 'click me'>>}}}|dot means use default value|<<toggleTag . . 'click me'>>|
    !!Notes
    * If TiddlerName doesn't exist it will be silently created
    * Set label to '-' to specify no label
    * See also http://mgtd-alpha.tiddlyspot.com/#ToggleTag2
    !!Known issues
    * Doesn't smoothly handle the case where you toggle a tag in a tiddler that is current open for editing
    * Should convert to use named params
    ***/
    //{{{

    if (config.toggleTagAlwaysTouchModDate == undefined) config.toggleTagAlwaysTouchModDate = false;

    merge(config.macros,{

    	toggleTag: {

    		createIfRequired: true,
    		shortLabel: "[[%0]]",
    		longLabel: "[[%0]] [[%1]]",

    		handler: function(place,macroName,params,wikifier,paramString,tiddler) {
    			var tiddlerTitle = tiddler ? tiddler.title : '';
    			var tag   = (params[0] && params[0] != '.') ? params[0] : "checked";
    			var title = (params[1] && params[1] != '.') ? params[1] : tiddlerTitle;
    			var defaultLabel = (title == tiddlerTitle ? this.shortLabel : this.longLabel);
    			var label = (params[2] && params[2] != '.') ? params[2] : defaultLabel;
    			var touchMod = (params[3] && params[3] != '.') ? params[3] : "";
    			label = (label == '-' ? '' : label); // dash means no label
    			var theTiddler = (title == tiddlerTitle ? tiddler : store.getTiddler(title));
    			var cb = createTiddlyCheckbox(place, label.format([tag,title]), theTiddler && theTiddler.isTagged(tag), function(e) {
    				if (!store.tiddlerExists(title)) {
    					if (config.macros.toggleTag.createIfRequired) {
    						var content = store.getTiddlerText(title); // just in case it's a shadow
    						store.saveTiddler(title,title,content?content:"",config.options.txtUserName,new Date(),null);
    					}
    					else
    						return false;
    				}
    				if ((touchMod != "" || config.toggleTagAlwaysTouchModDate) && theTiddler)
    						theTiddler.modified = new Date();
    				store.setTiddlerTag(title,this.checked,tag);
    				return true;
    			});
    		}
    	}
    });

    //}}}

    Welcome to FreeCAD!

    FreeCAD will be a general purpose 3D CAD modeler. The development is completely Open Source (GPL & LGPL License). FreeCAD is aimed directly at mechanical engineering and product design but also fits in a wider range of uses around engineering, such as architecture or other engineering specialties.

    FreeCAD features tools similar to Catia, SolidWorks or Solid Edge, and therefore also falls into the category of MCAD, PLM, CAx and CAE. It will be a feature based parametric modeler with a modular software architecture which makes it easy to provide additional functionality without modifying the core system.