https://www.na-mic.org/w/api.php?action=feedcontributions&user=TerryLorber&feedformat=atomNAMIC Wiki - User contributions [en]2024-03-29T16:00:16ZUser contributionsMediaWiki 1.33.0https://www.na-mic.org/w/index.php?title=AHM2009:NITRC_and_Slicer&diff=34314AHM2009:NITRC and Slicer2009-01-06T14:58:59Z<p>TerryLorber: </p>
<hr />
<div>Back to [[AHM_2009]]<br />
<br />
==Breakout session Moderator: Steve Pieper==<br />
<br />
==Agenda:==<br />
<br />
* Review of Goals ([[media:NITRC-Pieper-2008-06-30.ppt | NA-MIC Presentation to NITRC AHM June 30, 2008]]).<br />
* Issues<br />
** Need to have compile extensions with same configuration as slicer<br />
** Need to make it easy for users to find and manage extensions<br />
* Current Developments<br />
** User Experience<br />
*** Module Search Wizard<br />
*** [http://www.slicer.org/slicerWiki/index.php/Slicer3:UIDesign:WorkingProblems:ModuleManagementWizard:Draft1 UIDesign Mockups]<br />
** CMake Configurations for Building Outside of Slicer Tree<br />
*** example [http://www.nitrc.org/plugins/scmsvn/viewcvs.php/trunk/Slicer3ExampleModules/Loadable/?root=slicer3examples Slicer3ExampleModules @ NITRC.org]<br />
** Module Discovery Process<br />
*** Command Line Modules<br />
*** Loadable Interactive Modules<br />
*** Scripted Modules<br />
** Extension Build System<br />
*** ''.s3ext'' files in Slicer3/Extensions describe each module<br />
*** example [http://viewvc.slicer.org/viewcvs.cgi/trunk/Extensions/BubbleMaker.s3ext?rev=8225&view=markup BubbleMaker.s3ext]<br />
*** [http://viewvc.slicer.org/viewcvs.cgi/trunk/Scripts/extend.tcl?rev=8224&view=markup extend.tcl]<br />
./Scripts/extend.tcl --verbose --clean<br />
*** getbuildtest.tcl --extend<br />
*** http://ext.slicer.org/ext<br />
*** [http://viewvc.slicer.org/viewcvs.cgi/trunk/Scripts/extend.tcl?rev=8224&view=markup lsext.tcl]<br />
./Scripts/lsext.tcl -b darwin-x86 -d 2008-12-30 --verbose<br />
* Discussion of TODO Items<br />
** Module Dependencies<br />
** Persistence of Module Installations Across Updates (auto-update feature for slicer3)<br />
** Grouping of Related Modules<br />
** Test Data for Modules<br />
** Avoid Restart and/or Save Dialog before restart<br />
<br />
==References:==<br />
<br />
* [[NA-MIC_External_Collaborations#NA-MIC_Collaboration_with_NITRC | NITRC Collaboration Page]] on the NA-MIC wiki.<br />
<br />
* Ongoing discussions between NA-MIC and NITRC personnel<br />
** face-to-face meetings at Society for Neuroscience 2007<br />
** Steve Pieper to serve on NITRC change control board<br />
* [http://www.slicer.org/slicerWiki/index.php/Slicer3:Loadable_Modules Slicer3:Loadable_Modules] project to enable NITRC-based plug-ins.<br />
* [http://www.nitrc.org/projects/slicer/ Slicer page at NITRC]<br />
* [http://www.nitrc.org/projects/dtiricianrem/ DTI Rician Noise removal filter, slicer3 plug-in developed at University of Utah]<br />
* [http://www.nitrc.org/projects/multimodereg/ Image Registration Tool BRAINSfit, slicer3 plug-in developed at University of Iowa]<br />
* [http://www.nitrc.org/projects/stfilter/ Stochastic Tractography, slicer3 plug-in developed at MIT]</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=AHM2009:NITRC_and_Slicer&diff=34313AHM2009:NITRC and Slicer2009-01-06T14:58:10Z<p>TerryLorber: </p>
<hr />
<div>Back to [[AHM_2009]]<br />
<br />
==Breakout session Moderator: Steve Pieper==<br />
<br />
==Agenda:==<br />
<br />
* Review of Goals ([[media:NITRC-Pieper-2008-06-30.ppt | NA-MIC Presentation to NITRC AHM June 30, 2008]]).<br />
* Issues<br />
** Need to have compile extensions with same configuration as slicer<br />
** Need to make it easy for users to find and manage extensions<br />
* Current Developments<br />
** User Experience<br />
*** Module Search Wizard<br />
*** [http://www.slicer.org/slicerWiki/index.php/Slicer3:UIDesign:WorkingProblems:ModuleManagementWizard:Draft1 UIDesign Mockups]<br />
** CMake Configurations for Building Outside of Slicer Tree<br />
** example [http://www.nitrc.org/plugins/scmsvn/viewcvs.php/trunk/Slicer3ExampleModules/Loadable/?root=slicer3examples]<br />
** Module Discovery Process<br />
*** Command Line Modules<br />
*** Loadable Interactive Modules<br />
*** Scripted Modules<br />
** Extension Build System<br />
*** ''.s3ext'' files in Slicer3/Extensions describe each module<br />
*** example [http://viewvc.slicer.org/viewcvs.cgi/trunk/Extensions/BubbleMaker.s3ext?rev=8225&view=markup BubbleMaker.s3ext]<br />
*** [http://viewvc.slicer.org/viewcvs.cgi/trunk/Scripts/extend.tcl?rev=8224&view=markup extend.tcl]<br />
./Scripts/extend.tcl --verbose --clean<br />
*** getbuildtest.tcl --extend<br />
*** http://ext.slicer.org/ext<br />
*** [http://viewvc.slicer.org/viewcvs.cgi/trunk/Scripts/extend.tcl?rev=8224&view=markup lsext.tcl]<br />
./Scripts/lsext.tcl -b darwin-x86 -d 2008-12-30 --verbose<br />
* Discussion of TODO Items<br />
** Module Dependencies<br />
** Persistence of Module Installations Across Updates (auto-update feature for slicer3)<br />
** Grouping of Related Modules<br />
** Test Data for Modules<br />
** Avoid Restart and/or Save Dialog before restart<br />
<br />
==References:==<br />
<br />
* [[NA-MIC_External_Collaborations#NA-MIC_Collaboration_with_NITRC | NITRC Collaboration Page]] on the NA-MIC wiki.<br />
<br />
* Ongoing discussions between NA-MIC and NITRC personnel<br />
** face-to-face meetings at Society for Neuroscience 2007<br />
** Steve Pieper to serve on NITRC change control board<br />
* [http://www.slicer.org/slicerWiki/index.php/Slicer3:Loadable_Modules Slicer3:Loadable_Modules] project to enable NITRC-based plug-ins.<br />
* [http://www.nitrc.org/projects/slicer/ Slicer page at NITRC]<br />
* [http://www.nitrc.org/projects/dtiricianrem/ DTI Rician Noise removal filter, slicer3 plug-in developed at University of Utah]<br />
* [http://www.nitrc.org/projects/multimodereg/ Image Registration Tool BRAINSfit, slicer3 plug-in developed at University of Iowa]<br />
* [http://www.nitrc.org/projects/stfilter/ Stochastic Tractography, slicer3 plug-in developed at MIT]</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:How_to_implement_an_Interactive_Module_GUI&diff=24290Slicer3:How to implement an Interactive Module GUI2008-04-30T01:00:48Z<p>TerryLorber: </p>
<hr />
<div>= How to implement an Interactive Module GUI for Slicer3 =<br />
<br />
== Virtual Methods ==<br />
<br />
At the slicer-developers tcon 2007-02-13, we discussed some adjustments to the virtual methods in vtkSlicerModuleGUI for better consistency and utility. The following list defines the methods that a module needs to implement so the main application (Slicer3.cxx) can operate on all modules generically:<br />
<br />
<div style="width: 40%; float: left; padding-right: 3%;"><br />
The following methods are defined by the vtkSlicerModuleGUI and typically won't be overriden:<br />
<br />
* '''Enter'''<br />
** ''called when module is raised''<br />
** ''calls CreateGUI if needed (instance variable tracks create state)''<br />
** ''calls AddGUIObservers''<br />
** ''calls UpdateGUI''<br />
* '''Exit'''<br />
** ''called when module is replaced by another''<br />
** ''calls RemoveMRMLObservers''<br />
</div><br />
<br />
<div style="width: 40%; float: left; padding-right: 3%;"><br />
<br />
The following methods should be defined by the Module to implement the specific behavior:<br />
<br />
* '''CreateGUI'''<br />
** ''instances and packs widgets''<br />
* '''DestroyGUI'''<br />
** ''typically called only by destructor''<br />
** ''breaks any reference cycles''<br />
** ''Deletes widgets''<br />
* '''ProcessGUIEvents'''<br />
** ''responds to events from widgets or slicer GUI classes''<br />
** ''propagates data from GUI into MRML nodes''<br />
* '''ProcessMRMLEvents'''<br />
** ''responds to updates to MRML nodes''<br />
** ''propagates data from MRML to widgets''<br />
* '''AddGUIObservers'''<br />
** ''set observers on widgets and GUI classes (use GUICallbackCommand local instance -- it will call ProcessGUIEvents)''<br />
* '''AddMRMLObservers'''<br />
** ''set observers on MRML nodes and scene (use MRMLCallbackCommand local instance -- it will call ProcessMRMLEvents)''<br />
* '''RemoveGUIObservers'''<br />
* '''RemoveMRMLObservers'''<br />
* '''UpdateGUI'''<br />
** ''copy state from MRML nodes to GUI/Widgets''<br />
** ''if needed for efficiency, check the MTime for the MRML Node and the corresponding GUI and only update if needed (e.g. for a MultiColumnList or other widget the holds a lot of data)'' <br />
* '''UpdateMRML'''<br />
** ''copy state from GUI/Widgets to MRML''<br />
</div><br />
<br />
<br style="clear: both;" /><br />
<br />
== Usage ==<br />
<br />
'''NOTE: this description may change as Slicer3 moves from Beta to official release.'''<br />
The figure below shows a current overview of the three classes a new module (called MyModule for example) will need to define (vtkSlicerMyModuleGUI, vtkSlicerMyModuleLogic and vtkMRMLMyModuleNode) and some of the methods those classes should include to utilize the Slicer3 infrastructure. These classes should reside in the Slicer3/Modules/MyModule/ directory. If there are only one or two MRML class files, these can be in the top directory; if there are many files, you can create a Slicer3/Modules/MyModule/MRML directory. Slicer3/Libs/MRML should only include nodes that are part of the "primary" MRML support, ''i.e.'' things that make sense to include in the MRML file for data interchange.<br />
<br />
[[Image:Slicer3MyModule.png|[[Image:Slicer3MyModule.png| Base classes for GUI, Logic and MRML ]]]]<br />
<br />
===Deriving your GUI class===<br />
To create a Module GUI that expresses its interface in Slicer's shared UIpanel, derive your class (vtkSlicerMyModuleGUI) from vtkSlicerModuleGUI. For a Module GUI that expresses its interface in a different panel of the Main Slicer Window, or in a toplevel widget, derive vtkSlicerMyModuleGUI from vtkSlicerComponentGUI instead. Your GUI class will inherit application logic and MRML pointers, an API for setting and observing them, and a framework for defining MRML, Logic and GUI callbacks from its parent class. Specific mediator methods, other logic and MRML node pointers can be added to the module's class definition. Importantly, keep logic and MRML classes independent of the GUI to facilitate testing and command-line execution possible *without* instantiating the Slicer3 GUI.<br />
<br />
'''Example:''' An early example to work from is the GradientAnisotropicDiffusionFilter Module; define all the widgets you need within the class and create Get Macros for each of them. Define the methods you need from vtkSlicerModuleGUI and its parent class vtkSlicerComponentGUI, including BuildGUI(); in this method, you'll first add a page to the class's UIPanel (for now, only create one page).<br />
<br />
=== Two GUI styles ===<br />
'''Two styles:''' Depending on whether you want a notebook-style GUI for your module (similar to the style used in Slicer2) or a set of stacked collapsible frames to contain different logical sections of your interface like "help" and "display", your BuildGUI() method can be written in one of two ways. The '''notebook style''' may be appropriate for modules with long logical sections within their GUI, to minimize the amount of scrolling required of a user. The '''collapsing style''' may be appropriate for modules that have numerous logical sections, since the amount of horizontal space across which a notebook would array them is limited. The way these two styles are expressed in Slicer3's GUI panel is shown below.<br />
<br />
[[Image:S3ModuleStyles.png]]<br />
<br />
'''''Collapsing style:''''' The GradientAnisotropicDiffusionFilter Module example implements the collapsible style, first adding a single new Page in its UIPanel:<br />
<br />
this->UIPanel->AddPage ( "MyModule", "MyModule", NULL );<br />
<br />
then creating a vtkSlicerModuleCollapsibleFrame widget for each logical section in the GUI, parenting each to the UIPanel's single PageWidget, then creating, configuring and packing them from top to bottom in the UIPanel's PageWidget. Each logical section's widgets can be organized inside each of the vtkSlicerModuleCollapsibleFrames. The superclass has some helper methods to construct consisten Help&About Frames across modules.<br />
<br />
//--- help and about frame<br />
const char *help = "MyModule does the following...";<br />
const char *about = "This work was supported by...";<br />
vtkKWWidget *page = this->UIPanel->GetPageWidget ("MyModule");<br />
this->BuildHelpAndAboutFrame ( page, help, about );<br />
<br />
//--- rest of the frames<br />
vtkSlicerModuleCollapsibleFrame *firstFrame = vtkSlicerModuleCollapsibleFrame::New ( );<br />
vtkSlicerModuleCollapsibleFrame *secondFrame = vtkSlicerModuleCollapsibleFrame::New ( );<br />
vtkSlicerModuleCollapsibleFrame *thirdFrame = vtkSlicerModuleCollapsibleFrame::New ( );<br />
vtkSlicerModuleCollapsibleFrame *forthFrame = vtkSlicerModuleCollapsibleFrame::New ( );<br />
...<br />
//--- parenting the frames to the same UIpanel page<br />
firstFrame->SetParent ( page );<br />
secondFrame->SetParent ( page );<br />
...<br />
//--- parenting widgets to the various frames<br />
this->widget2->SetParent ( firstFrame->GetFrame () );<br />
this->widget3->SetParent ( secondFrame->GetFrame () );<br />
<br />
'''''Notebook style:''''' To create a notebook style GUI (as there is no example yet, a little code will be included here), a new Page must be added to the UIPanel for every tab in the notebook:<br />
<br />
//--- get a pointer to the KWUserInterfaceManagerNotebook<br />
vtkKWUserInterfaceManagerNotebook *nbm = vtkKWUserInterfaceManagerNotebook::SafeDownCast ( this->UIPanel->GetUserInterfaceManager());<br />
//--- help and about frame<br />
this->UIPanel->AddPage ( "Help&About", "Information about using this module", NULL );<br />
const char *help = "MyModule does the following...";<br />
const char *about = "This work was supported by...";<br />
vtkKWWidget *page = this->UIPanel->GetPageWidget ("Help");<br />
this->BuildHelpAndAboutFrame ( page, help, about );<br />
<br />
//--- pages for other frames<br />
int page1ID = this->UIPanel->AddPage ( "First", "Functionality for some logical piece of module", NULL );<br />
int page2ID = this->UIPanel->AddPage ( "Second", "Functionality for another logical piece of module", NULL );<br />
<br />
//--- enabling or disabling notebook tabs<br />
nbm->GetNotebook()->SetPageEnabled ( page1ID, 1 );<br />
nbm->GetNotebook()->SetPageEnabled ( page2ID, 0 );<br />
<br />
Widgets to be packed within each notebook page are parented to the PageWidget:<br />
<br />
this->widget2->SetParent ( this->UIPanel->GetPageWidget ( "First" ) );<br />
this->widget3->SetParent ( this->UIPanel->GetPageWidget ( "Second" ) );<br />
<br />
or can be parented to a widget already parented to the PageWidget. Then they themselves can be created, configured, and packed in the same manner as they are in the GradientAnisotropicDiffusionFilter Module.<br />
<br />
=== Defining methods ===<br />
'''Methods to define:''' Define the methods you require from vtkSlicerComponentGUI base class, like: AddGUIObservers(), RemoveGUIObservers(), ProcessLogicEvents(), ProcessGUIEevents(), ProcessMRMLEvents(), Enter() and Exit(); and whatever else your module needs. (Eventually, available modules will be automatically detected, but this is not yet implemented; then, the Enter() method will probably be made to call the BuildGUI() method. For now, instantiate your class in Slicer3.cxx and call its BuildGUI() and other methods, following the pattern for other modules established there.)<br />
<br />
=== Adding and removing observers ===<br />
'''Adding observers:''' In AddGUIObservers, add an observer on each widget whose events you want to process. When an event is observed, the ProcessGUIEvents() method is called via the GUICallbackCommand; define this class to propagate information from the GUI to logic and MRML. Though it is tempting, try not to use ProcessGUIEvents() to update the GUI state directly -- just modify the Logic state, and allow observers on the logic and subsequent processing in ProcessLogicEvents() and ProcessMRMLEvents() to bring that state change BACK into the GUI.<br />
<br />
'''Removing observers:''' In RemoveGUIObservers, make sure you remove every observer you've added to widgets in the GUI before calling Delete() on your widget. Make sure you call SetAndObserveMRML() and SetAndObserveLogic( ) with NULL pointers in your GUI class destructor to remove all observers on MRML and Logic that you have created.<br />
<br />
=== Adding and removing references ===<br />
For convenience, you may want to define pointers to Slicer's MainViewer, or to the SliceViewers, etc. Before Delete() can be called on anything you are referencing, you'll need to release the references. (Failure to release references can result in vtkDebugLeak reports on Application exit). The virtual method TearDownGUI() (inherited from vtkSlicerComponentGUI) can be defined for this purpose. References may be released in this method, and you can also use this method to call RemoveGUIObservers() if you don't want to explicitly call that method.<br />
<br />
=== Defining new widgets ===<br />
'''Defining your own widgets:''' The framework for doing this is still evolving. Currently there are two types of new widgets, those defined as extensions to vtkKW (like vtkKWWindowLevelThresholdEditor.h/cxx) and those defined as Slicer-specific widgets, (like vtkSlicerSliceControlWidget.h/cxx, derived from the vtkSlicerWidget.h/cxx base class). The Slicer widgets have methods for putting observers on their widget components, Logic and MRML, and processing events as well. Thus GUI classes that instance them do not have to manage events for them if the widgets' methods are used instead.<br />
<br />
=== Using Undo and Redo ===<br />
'''Undo:''' Make sure you process those events that mark junctures at which MRML state should be saved for Undo/Redo (using MRML's SaveStateForUndo() method. For instance, when an entry widget's value has changed, before changing a parameter in the appropriate MRML node, make a call to the MRMLScene's SaveStateForUndo() method with that node as a parameter. Save MRML state at reasonable junctures: for instance, for scale widgets, save MRML state when the scale starts changing, rather than continuously as the scale changes. For an example of they way SaveStateForUndo() is called, see slicer3/Base/GUI/vtkSlicerSliceControllerWidget.cxx. A detailed description of how undo/redo works, and how to use it in your module is available [[Slicer3:Data_Model#Undo.2FRedo_Mechanism | here]].<br />
<br />
=== Adding the module to the rest of Slicer3 ===<br />
'''Other files you will have to touch:''' For now, to add your module to Slicer3, create a new instance of vtkSlicer''MyModule''Logic and vtkSlicer''MyModule''GUI in Applications/GUI/Slicer3.cxx, and follow the pattern used by the GradientAnisotropicDiffusionFilter module for now, until the framework is developed for Slicer3 to autodetect your module and do the right things. Then:<br />
<br />
* create your own module folder in the Slicer3/Modules directory<br />
* create your own CMakeLists.txt file <br />
* create the following files: vtk''MyModule''Win32Header.h, vtk''MyModule''Configure.h.in and vtk''MyModule''.h following the pattern set by other Modules (See [[Slicer3:Module Link Setup for Windows]])<br />
* add your module SUBDIR to the CMakeLists.txt file in the Slicer3/Modules directory above.<br />
* include relevant .h files in Slicer3/Applications/GUI/Slicer3.cxx<br />
* specify your module's source and binary Include directories in Slicer3/Application/GUI/CMakeLists.txt<br />
* and include your module in the CMakeLists.txt target link libraries<br />
<br />
===Add a module-switch in CMake===<br />
You can add an automatic on/off switch to the ccmake configuration GUI, which will make compilation and development for the user easier.<br />
To do this add the following to two CMakeLists.txt und the Slicer3.cxx files:<br />
<br />
* add the following lines to your Slicer3/Module/MyModule/CMakeLists.txt<br />
PROJECT(MyModule)<br />
<br />
OPTION(MYMODULE "Do you want to build the MyModule?")<br />
IF(MYMODULE)<br />
... (Rest of the file)<br />
ENDIF(MYMODULE)<br />
<br />
* after this you have MYMODULE as a variable which says if your module is build or not<br />
* but we want also to exclude the module library and our source in the Slicer3.cxx file if the module is not build<br />
* in /Slicer3/Applications/GUI/CMakeLists.txt add the following directly above TARGET_LINK_LIBRARIES(...<br />
IF(MYMODULE)<br />
SET(MYMODULE_LINK_LIB MyModule)<br />
ELSE(MYMODULE)<br />
ADD_DEFINITIONS(-DMYMODULE_DEBUG)<br />
ENDIF(MYMODULE)<br />
* then add to the TARGET_LINK_LIBRARIES(...${MYMODULE_LINK_LIB}) instead of your previous entry<br />
* the ''ADD_DEFINITIONS'' declaration adds a preprocessor symbol to the compile which we use to exclude our code from the /Slicer3/Applications/GUI/Slicer3.cxx<br />
* just border your code in /Slicer3/Applications/GUI/Slicer3.cxx with the following:<br />
#ifndef MYMODULE_DEBUG<br />
...(your code/includes)<br />
#endif<br />
<br />
=== Miscellaneous ===<br />
'''Helpful tips:'''<br />
* Make the vtkModuleCollapsibleFrames which contain the major logical sections of your module members of your module GUI class and expose them through your API. Doing so helps other developers, who may want to offer a jump to your module's functionality, to programmatically raise your UIpanel and expand the frame they're interested in. This paradigm will help to promote fluid navigation of slicer's interface and the reuse of existing functionality.<br />
<br />
* See [[Slicer3:Module Link Setup for Windows]]<br />
<br />
<br />
== Build Support ==<br />
<br />
[[ Slicer3:Module_Building ]]</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:How_to_implement_an_Interactive_Module_GUI&diff=24267Slicer3:How to implement an Interactive Module GUI2008-04-29T16:23:46Z<p>TerryLorber: </p>
<hr />
<div>= How to implement an Interactive Module GUI for Slicer3 =<br />
<br />
== Virtual Methods ==<br />
<br />
At the slicer-developers tcon 2007-02-13, we discussed some adjustments to the virtual methods in vtkSlicerModuleGUI for better consistency and utility. The following list defines the methods that a module needs to implement so the main application (Slicer3.cxx) can operate on all modules generically:<br />
<br />
<div style="width: 40%; float: left; padding-right: 3%;"><br />
The following methods are defined by the vtkSlicerModuleGUI and typically won't be overriden:<br />
<br />
* '''Enter'''<br />
** ''called when module is raised''<br />
** ''calls CreateGUI if needed (instance variable tracks create state)''<br />
** ''calls AddGUIObservers''<br />
** ''calls UpdateGUI''<br />
* '''Exit'''<br />
** ''called when module is replaced by another''<br />
** ''calls RemoveMRMLObservers''<br />
</div><br />
<br />
<div style="width: 40%; float: left; padding-right: 3%;"><br />
<br />
The following methods should be defined by the Module to implement the specific behavior:<br />
<br />
* '''CreateGUI'''<br />
** ''instances and packs widgets''<br />
* '''DestroyGUI'''<br />
** ''typically called only by destructor''<br />
** ''breaks any reference cycles''<br />
** ''Deletes widgets''<br />
* '''ProcessGUIEvents'''<br />
** ''responds to events from widgets or slicer GUI classes''<br />
** ''propagates data from GUI into MRML nodes''<br />
* '''ProcessMRMLEvents'''<br />
** ''responds to updates to MRML nodes''<br />
** ''propagates data from MRML to widgets''<br />
* '''AddGUIObservers'''<br />
** ''set observers on widgets and GUI classes (use GUICallbackCommand local instance -- it will call ProcessGUIEvents)''<br />
* '''AddMRMLObservers'''<br />
** ''set observers on MRML nodes and scene (use MRMLCallbackCommand local instance -- it will call ProcessMRMLEvents)''<br />
* '''RemoveGUIObservers'''<br />
* '''RemoveMRMLObservers'''<br />
* '''UpdateGUI'''<br />
** ''copy state from MRML nodes to GUI/Widgets''<br />
** ''if needed for efficiency, check the MTime for the MRML Node and the corresponding GUI and only update if needed (e.g. for a MultiColumnList or other widget the holds a lot of data)'' <br />
* '''UpdateMRML'''<br />
** ''copy state from GUI/Widgets to MRML''<br />
</div><br />
<br />
<br style="clear: both;" /><br />
<br />
== Usage ==<br />
<br />
'''NOTE: this description may change as Slicer3 moves from Beta to official release.'''<br />
The figure below shows a current overview of the three classes a new module (called MyModule for example) will need to define (vtkSlicerMyModuleGUI, vtkSlicerMyModuleLogic and vtkMRMLMyModuleNode) and some of the methods those classes should include to utilize the Slicer3 infrastructure. These classes should reside in the Slicer3/Modules/MyModule/ directory. If there are only one or two MRML class files, these can be in the top directory; if there are many files, you can create a Slicer3/Modules/MyModule/MRML directory. Slicer3/Libs/MRML should only include nodes that are part of the "primary" MRML support, ''i.e.'' things that make sense to include in the MRML file for data interchange.<br />
<br />
[[Image:Slicer3MyModule.png|[[Image:Slicer3MyModule.png| Base classes for GUI, Logic and MRML ]]]]<br />
<br />
===Deriving your GUI class===<br />
To create a Module GUI that expresses its interface in Slicer's shared UIpanel, derive your class (vtkSlicerMyModuleGUI) from vtkSlicerModuleGUI. For a Module GUI that expresses its interface in a different panel of the Main Slicer Window, or in a toplevel widget, derive vtkSlicerMyModuleGUI from vtkSlicerComponentGUI instead. Your GUI class will inherit application logic and MRML pointers, an API for setting and observing them, and a framework for defining MRML, Logic and GUI callbacks from its parent class. Specific mediator methods, other logic and MRML node pointers can be added to the module's class definition. Importantly, keep logic and MRML classes independent of the GUI to facilitate testing and command-line execution possible *without* instantiating the Slicer3 GUI.<br />
<br />
'''Example:''' An early example to work from is the GradientAnisotropicDiffusionFilter Module; define all the widgets you need within the class and create Get Macros for each of them. Define the methods you need from vtkSlicerModuleGUI and its parent class vtkSlicerComponentGUI, including BuildGUI(); in this method, you'll first add a page to the class's UIPanel (for now, only create one page).<br />
<br />
=== Two GUI styles ===<br />
'''Two styles:''' Depending on whether you want a notebook-style GUI for your module (similar to the style used in Slicer2) or a set of stacked collapsible frames to contain different logical sections of your interface like "help" and "display", your BuildGUI() method can be written in one of two ways. The '''notebook style''' may be appropriate for modules with long logical sections within their GUI, to minimize the amount of scrolling required of a user. The '''collapsing style''' may be appropriate for modules that have numerous logical sections, since the amount of horizontal space across which a notebook would array them is limited. The way these two styles are expressed in Slicer3's GUI panel is shown below.<br />
<br />
[[Image:S3ModuleStyles.png]]<br />
<br />
'''''Collapsing style:''''' The GradientAnisotropicDiffusionFilter Module example implements the collapsible style, first adding a single new Page in its UIPanel:<br />
<br />
this->UIPanel->AddPage ( "MyModule", "MyModule", NULL );<br />
<br />
then creating a vtkSlicerModuleCollapsibleFrame widget for each logical section in the GUI, parenting each to the UIPanel's single PageWidget, then creating, configuring and packing them from top to bottom in the UIPanel's PageWidget. Each logical section's widgets can be organized inside each of the vtkSlicerModuleCollapsibleFrames. The superclass has some helper methods to construct consisten Help&About Frames across modules.<br />
<br />
//--- help and about frame<br />
const char *help = "MyModule does the following...";<br />
const char *about = "This work was supported by...";<br />
vtkKWWidget *page = this->UIPanel->GetPageWidget ("MyModule");<br />
this->BuildHelpAndAboutFrame ( page, help, about );<br />
<br />
//--- rest of the frames<br />
vtkSlicerModuleCollapsibleFrame *firstFrame = vtkSlicerModuleCollapsibleFrame::New ( );<br />
vtkSlicerModuleCollapsibleFrame *secondFrame = vtkSlicerModuleCollapsibleFrame::New ( );<br />
vtkSlicerModuleCollapsibleFrame *thirdFrame = vtkSlicerModuleCollapsibleFrame::New ( );<br />
vtkSlicerModuleCollapsibleFrame *forthFrame = vtkSlicerModuleCollapsibleFrame::New ( );<br />
...<br />
//--- parenting the frames to the same UIpanel page<br />
firstFrame->SetParent ( page );<br />
secondFrame->SetParent ( page );<br />
...<br />
//--- parenting widgets to the various frames<br />
this->widget2->SetParent ( firstFrame->GetFrame () );<br />
this->widget3->SetParent ( secondFrame->GetFrame () );<br />
<br />
'''''Notebook style:''''' To create a notebook style GUI (as there is no example yet, a little code will be included here), a new Page must be added to the UIPanel for every tab in the notebook:<br />
<br />
//--- get a pointer to the KWUserInterfaceManagerNotebook<br />
vtkKWUserInterfaceManagerNotebook *nbm = vtkKWUserInterfaceManagerNotebook::SafeDownCast ( this->UIPanel->GetUserInterfaceManager());<br />
//--- help and about frame<br />
this->UIPanel->AddPage ( "Help&About", "Information about using this module", NULL );<br />
const char *help = "MyModule does the following...";<br />
const char *about = "This work was supported by...";<br />
vtkKWWidget *page = this->UIPanel->GetPageWidget ("Help");<br />
this->BuildHelpAndAboutFrame ( page, help, about );<br />
<br />
//--- pages for other frames<br />
int page1ID = this->UIPanel->AddPage ( "First", "Functionality for some logical piece of module", NULL );<br />
int page2ID = this->UIPanel->AddPage ( "Second", "Functionality for another logical piece of module", NULL );<br />
<br />
//--- enabling or disabling notebook tabs<br />
nbm->GetNotebook()->SetPageEnabled ( page1ID, 1 );<br />
nbm->GetNotebook()->SetPageEnabled ( page2ID, 0 );<br />
<br />
Widgets to be packed within each notebook page are parented to the PageWidget:<br />
<br />
this->widget2->SetParent ( this->UIPanel->GetPageWidget ( "First" ) );<br />
this->widget3->SetParent ( this->UIPanel->GetPageWidget ( "Second" ) );<br />
<br />
or can be parented to a widget already parented to the PageWidget. Then they themselves can be created, configured, and packed in the same manner as they are in the GradientAnisotropicDiffusionFilter Module.<br />
<br />
=== Defining methods ===<br />
'''Methods to define:''' Define the methods you require from vtkSlicerComponentGUI base class, like: AddGUIObservers(), RemoveGUIObservers(), ProcessLogicEvents(), ProcessGUIEevents(), ProcessMRMLEvents(), Enter() and Exit(); and whatever else your module needs. (Eventually, available modules will be automatically detected, but this is not yet implemented; then, the Enter() method will probably be made to call the BuildGUI() method. For now, instantiate your class in Slicer3.cxx and call its BuildGUI() and other methods, following the pattern for other modules established there.)<br />
<br />
=== Adding and removing observers ===<br />
'''Adding observers:''' In AddGUIObservers, add an observer on each widget whose events you want to process. When an event is observed, the ProcessGUIEvents() method is called via the GUICallbackCommand; define this class to propagate information from the GUI to logic and MRML. Though it is tempting, try not to use ProcessGUIEvents() to update the GUI state directly -- just modify the Logic state, and allow observers on the logic and subsequent processing in ProcessLogicEvents() and ProcessMRMLEvents() to bring that state change BACK into the GUI.<br />
<br />
'''Removing observers:''' In RemoveGUIObservers, make sure you remove every observer you've added to widgets in the GUI before calling Delete() on your widget. Make sure you call SetAndObserveMRML() and SetAndObserveLogic( ) with NULL pointers in your GUI class destructor to remove all observers on MRML and Logic that you have created.<br />
<br />
=== Adding and removing references ===<br />
For convenience, you may want to define pointers to Slicer's MainViewer, or to the SliceViewers, etc. Before Delete() can be called on anything you are referencing, you'll need to release the references. (Failure to release references can result in vtkDebugLeak reports on Application exit). The virtual method TearDownGUI() (inherited from vtkSlicerComponentGUI) can be defined for this purpose. References may be released in this method, and you can also use this method to call RemoveGUIObservers() if you don't want to explicitly call that method.<br />
<br />
=== Defining new widgets ===<br />
'''Defining your own widgets:''' The framework for doing this is still evolving. Currently there are two types of new widgets, those defined as extensions to vtkKW (like vtkKWWindowLevelThresholdEditor.h/cxx) and those defined as Slicer-specific widgets, (like vtkSlicerSliceControlWidget.h/cxx, derived from the vtkSlicerWidget.h/cxx base class). The Slicer widgets have methods for putting observers on their widget components, Logic and MRML, and processing events as well. Thus GUI classes that instance them do not have to manage events for them if the widgets' methods are used instead.<br />
<br />
=== Using Undo and Redo ===<br />
'''Undo:''' Make sure you process those events that mark junctures at which MRML state should be saved for Undo/Redo (using MRML's SaveStateForUndo() method. For instance, when an entry widget's value has changed, before changing a parameter in the appropriate MRML node, make a call to the MRMLScene's SaveStateForUndo() method with that node as a parameter. Save MRML state at reasonable junctures: for instance, for scale widgets, save MRML state when the scale starts changing, rather than continuously as the scale changes. For an example of they way SaveStateForUndo() is called, see slicer3/Base/GUI/vtkSlicerSliceControllerWidget.cxx. A detailed description of how undo/redo works, and how to use it in your module is available [[Slicer3:Data_Model#Undo.2FRedo_Mechanism | here]].<br />
<br />
=== Adding the module to the rest of Slicer3 ===<br />
'''Other files you will have to touch:''' For now, to add your module to Slicer3, create a new instance of vtkSlicer''MyModule''Logic and vtkSlicer''MyModule''GUI in Applications/GUI/Slicer3.cxx, and follow the pattern used by the GradientAnisotropicDiffusionFilter module for now, until the framework is developed for Slicer3 to autodetect your module and do the right things. Then:<br />
<br />
* create your own module folder in the Slicer3/Modules directory<br />
* create your own CMakeLists.txt file <br />
* create the following files: vtk''MyModule''Win32Header.h, vtk''MyModule''Configure.h.in and vtk''MyModule''.h following the pattern set by other Modules (See [[Slicer3:Module Link Setup for Windows]])<br />
* add your module SUBDIR to the CMakeLists.txt file in the Slicer3/Modules directory above.<br />
* include relevant .h files in Slicer3/Applications/GUI/Slicer3.cxx<br />
* specify your module's source and binary Include directories in Slicer3/Application/GUI/CMakeLists.txt<br />
* and include your module in the CMakeLists.txt target link libraries<br />
<br />
===Add a module-switch in CMake===<br />
You can add an automatic on/off switch to the ccmake configuration GUI, which will make compilation and development for the user easier.<br />
To do this add the following to two CMakeLists.txt und the Slicer3.cxx files:<br />
<br />
* add the following lines to your Slicer3/Module/MyModule/CMakeLists.txt<br />
PROJECT(MyModule)<br />
<br />
OPTION(MYMODULE "Do you want to build the MyModule?")<br />
IF(MYMODULE)<br />
... (Rest of the file)<br />
ENDIF(MYMODULE)<br />
<br />
* after this you have MYMODULE as a variable which says if your module is build or not<br />
* but we want also to exclude the module library and our source in the Slicer3.cxx file if the module is not build<br />
* in /Slicer3/Applications/GUI/CMakeLists.txt add the following directly above TARGET_LINK_LIBRARIES(...<br />
IF(MYMODULE)<br />
SET(MYMODULE_LINK_LIB MyModule)<br />
ELSE(MYMODULE)<br />
ADD_DEFINITIONS(-DMYMODULE_DEBUG)<br />
ENDIF(MYMODULE)<br />
* then add to the TARGET_LINK_LIBRARIES(...${MYMODULE_LINK_LIB}) instead of your previous entry<br />
* the ''ADD_DEFINITIONS'' declaration adds a preprocessor symbol to the compile which we use to exclude our code from the /Slicer3/Applications/GUI/Slicer3.cxx<br />
* just border your code in /Slicer3/Applications/GUI/Slicer3.cxx with the following:<br />
#ifndef MYMODULE_DEBUG<br />
...(your code/includes)<br />
#endif<br />
<br />
== Build Support ==<br />
<br />
[[ Slicer3:Module_Building ]]<br />
<br />
=== Miscellaneous ===<br />
'''Helpful tips:'''<br />
* Make the vtkModuleCollapsibleFrames which contain the major logical sections of your module members of your module GUI class and expose them through your API. Doing so helps other developers, who may want to offer a jump to your module's functionality, to programmatically raise your UIpanel and expand the frame they're interested in. This paradigm will help to promote fluid navigation of slicer's interface and the reuse of existing functionality.<br />
<br />
* See [[Slicer3:Module Link Setup for Windows]]</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:Module_Building&diff=24264Slicer3:Module Building2008-04-29T15:40:24Z<p>TerryLorber: /* ExampleModule.txt */</p>
<hr />
<div>In order to create a Slicer3 interactice GUI module that can be discovered at run-time, the following two files need to be created or modified.<br />
<br />
=== ExampleModule.txt ===<br />
<br />
Create this file alongside vtkExampleModuleGUI and vtkExampleModuleLogic. It's contents are key:value pairs describing the module. It's also used to configure build-time module selection. For loadable module support the following entries are used:<br />
<br />
Name: Example<br />
GUIName: ExMod<br />
Dependency: Other<br />
Dependency: Another<br />
<br />
Only the "Name:" entry is required.<br />
<br />
=== CMakeLists.txt ===<br />
<br />
In order to create the necessary source files to enable an module to be discovered at run-time, use the GENERATELM macro in the module's CMakeLists.txt file:<br />
<br />
<br />
GENERATELM(ExampleModule_SRCS ExampleModule.txt)<br />
<br />
This macro must be included after any TCL wrapping macros, as it adds to the source files for the library.</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:Module_Building&diff=24261Slicer3:Module Building2008-04-29T15:04:08Z<p>TerryLorber: </p>
<hr />
<div>In order to create a Slicer3 interactice GUI module that can be discovered at run-time, the following two files need to be created or modified.<br />
<br />
=== ExampleModule.txt ===<br />
<br />
Create this file alongside vtkExampleModuleGUI and vtkExampleModuleLogic. It's contents are key:value pairs describing the module. It's also used to configure build-time module selection. For loadable module support the following entries are used:<br />
<br />
Name: Example<br />
GUIName: ExMod<br />
Dependency: Other<br />
Dependency: Another<br />
<br />
=== CMakeLists.txt ===<br />
<br />
In order to create the necessary source files to enable an module to be discovered at run-time, use the GENERATELM macro in the module's CMakeLists.txt file:<br />
<br />
<br />
GENERATELM(ExampleModule_SRCS ExampleModule.txt)<br />
<br />
This macro must be included after any TCL wrapping macros, as it adds to the source files for the library.</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:Module_Building&diff=24260Slicer3:Module Building2008-04-29T15:02:09Z<p>TerryLorber: </p>
<hr />
<div>In order to create a Slicer3 interactice GUI module that can be discovered at run-time, the following two files need to be created or modified.<br />
<br />
=== ExampleModule.txt ===<br />
<br />
Create this file alongside vtkExampleModuleGUI and vtkExampleModuleLogic. It's contents are key:value pairs describing the module. It's also used to configure build-time module selection. For loadable module support the following entries are used:<br />
<br />
Name: Example<br />
GUIName: ExMod<br />
Dependency: Other<br />
Dependency: Another<br />
<br />
=== CMakeLists.txt ===<br />
<br />
In order to create the necessary source files to enable an module to be discovered at run-time, use the GENERATELM macro in the module's CMakeLists.txt file:<br />
<br />
<br />
GENERATELM(ExampleModule_SRCS ExampleModule.txt)</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:Module_Building&diff=24259Slicer3:Module Building2008-04-29T15:01:01Z<p>TerryLorber: New page: === ExampleModule.txt === Create this file alongside vtkExampleModuleGUI and vtkExampleModuleLogic. It's contents are key:value pairs describing the module. It's also used to configure...</p>
<hr />
<div><br />
=== ExampleModule.txt ===<br />
<br />
Create this file alongside vtkExampleModuleGUI and vtkExampleModuleLogic. It's contents are key:value pairs describing the module. It's also used to configure build-time module selection. For loadable module support the following entries are used:<br />
<br />
Name: Example<br />
GUIName: ExMod<br />
Dependency: Other<br />
Dependency: Another<br />
<br />
=== CMakeLists.txt ===<br />
<br />
In order to create the necessary source files to enable an module to be discovered at run-time, use the GENERATELM macro in the module's CMakeLists.txt file:<br />
<br />
<br />
GENERATELM(ExampleModule_SRCS ExampleModule.txt)</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:Loadable_Modules:Phase1&diff=23789Slicer3:Loadable Modules:Phase12008-04-11T13:43:05Z<p>TerryLorber: /* example XML loadable module description */</p>
<hr />
<div>From [[Slicer3:Loadable_Modules]]:<br />
* runtime module discovery<br />
* module template<br />
* like CommandLineModuleFactory <br />
<br />
----<br />
<br />
<br />
Starting at ~900 in Applications/GUI/Slicer3.cxx, static modules load occurs.<br />
<br />
Using vtkSys tools to list shared libraries present. Use itk::DyanmicLoader to open libraries and call our specified entry points.<br />
<br />
The actions taken for each module to be added could be queried from the found shared library using a LoadableModuleInfo class. Some of the information a library should provide:<br />
<br />
* vtkSlicerLogic pointer (maybe this is one of the defined entry points for a loadable module)<br />
* methods to call on the Logic pointer<br />
* vtkSlicerModulesGUI pointer (ditto)<br />
* methods to call on the GUI pointer<br />
* module name<br />
<br />
LoadableModuleFactory (dervie from? Libs/ModuleDescriptionParser/ModuleFactory.cxx) handles this. Looks like ModuleFactory::ScanForSharedObjectModules does something very similar.<br />
<br />
<br />
Create shared libraries for each of the static modules listed in Slicer3.cxx<br />
<br />
==== loadable modules entry points ====<br />
<br />
void* GetLoadableModuleGUI<br />
void* GetLoadableModuleLogic<br />
char* GetLoadableModuleDescription<br />
<br />
That might be it, it'd be nice to have the module describe the necessary methods to call on the GUI and Logic pointer, but that might be Phase I-A. Within Slicer3_main, there doesn't seem to be much variation.<br />
<br />
Slicer3.cxx also defines [modulename]_Init(Tcl_Interp* interp) functions and calls them for each module. Should this also be conditional for loadable modules? Does it require an additional entry point?<br />
<br />
==== loadable module support ====<br />
<br />
<br />
Is there a header/source file that should be added to every module? Can we follow the CLP methodology and use an XML source and CMake driven tool to generate the necessary files?<br />
<br />
==== example loadable module description, named SlicerTractographyDisplayModule.txt ====<br />
<br />
Name: Slicer Tractography Display<br />
GUIName: LoadDisplaySave<br />
<br />
===== result of tele-conference 28jan2008 =====<br />
<br />
Things that the module's XML description should be able to tell:<br />
Name<br />
Group<br />
Description<br />
Home Page<br />
Dependencies (on other Groups or Modules and what versions)<br />
Version #<br />
[and maybe:]<br />
icon<br />
Author(s)<br />
Acknowledgment(s)<br />
<br />
Module Groups for Slicer3:<br />
Base<br />
Segmentation<br />
Registration<br />
Filtering<br />
Diffusion Imaging/Tractography<br />
Modeling<br />
Meshing<br />
Image Guided Therapy<br />
Rendering<br />
Radiation Treatment<br />
Microscopy<br />
Astronomy<br />
Utilities<br />
Databases (XCEDE?)<br />
Other<br />
<br />
Options users might want to specify when building:<br />
src install vs. binary download<br />
version #'s of libs (e.g. cvs tags or branches to use)<br />
release build vs debug build<br />
clean rebuild<br />
update/refresh libraries<br />
run tests and submit to dashboard<br />
make an installation package<br />
upload to web site<br />
<br />
==== SVN branch ====<br />
<br />
http://www.na-mic.org/svn/Slicer3/branches/tgl_loadable_modules/<br />
<br />
==== References ====<br />
<br />
[[Slicer3:Execution_Model_Documentation]]<br />
<br />
[[Slicer3:How_to_implement_an_Interactive_Module_GUI]]</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:Loadable_Modules:Phase1&diff=23251Slicer3:Loadable Modules:Phase12008-03-25T22:11:38Z<p>TerryLorber: </p>
<hr />
<div>From [[Slicer3:Loadable_Modules]]:<br />
* runtime module discovery<br />
* module template<br />
* like CommandLineModuleFactory <br />
<br />
----<br />
<br />
<br />
Starting at ~900 in Applications/GUI/Slicer3.cxx, static modules load occurs.<br />
<br />
Using vtkSys tools to list shared libraries present. Use itk::DyanmicLoader to open libraries and call our specified entry points.<br />
<br />
The actions taken for each module to be added could be queried from the found shared library using a LoadableModuleInfo class. Some of the information a library should provide:<br />
<br />
* vtkSlicerLogic pointer (maybe this is one of the defined entry points for a loadable module)<br />
* methods to call on the Logic pointer<br />
* vtkSlicerModulesGUI pointer (ditto)<br />
* methods to call on the GUI pointer<br />
* module name<br />
<br />
LoadableModuleFactory (dervie from? Libs/ModuleDescriptionParser/ModuleFactory.cxx) handles this. Looks like ModuleFactory::ScanForSharedObjectModules does something very similar.<br />
<br />
<br />
Create shared libraries for each of the static modules listed in Slicer3.cxx<br />
<br />
==== loadable modules entry points ====<br />
<br />
void* GetLoadableModuleGUI<br />
void* GetLoadableModuleLogic<br />
char* GetLoadableModuleDescription<br />
<br />
That might be it, it'd be nice to have the module describe the necessary methods to call on the GUI and Logic pointer, but that might be Phase I-A. Within Slicer3_main, there doesn't seem to be much variation.<br />
<br />
Slicer3.cxx also defines [modulename]_Init(Tcl_Interp* interp) functions and calls them for each module. Should this also be conditional for loadable modules? Does it require an additional entry point?<br />
<br />
==== loadable module support ====<br />
<br />
<br />
Is there a header/source file that should be added to every module? Can we follow the CLP methodology and use an XML source and CMake driven tool to generate the necessary files?<br />
<br />
==== example XML loadable module description ====<br />
<br />
<?xml version="1.0" encoding="utf-8"?><br />
<loadable><br />
<name>Volume Rendering Module</name><br />
<shortname>VRModule</shortname><br />
<guiname>VolumeRendering</guiname><br />
<tclinitname>Volumerenderingmodule_Init</tclinitname><br />
<message>Initializing Volume Rendering Module...</message><br />
</loadable><br />
<br />
===== result of tele-conference 28jan2008 =====<br />
<br />
Things that the module's XML description should be able to tell:<br />
Name<br />
Group<br />
Description<br />
Home Page<br />
Dependencies (on other Groups or Modules and what versions)<br />
Version #<br />
[and maybe:]<br />
icon<br />
Author(s)<br />
Acknowledgment(s)<br />
<br />
Module Groups for Slicer3:<br />
Base<br />
Segmentation<br />
Registration<br />
Filtering<br />
Diffusion Imaging/Tractography<br />
Modeling<br />
Meshing<br />
Image Guided Therapy<br />
Rendering<br />
Radiation Treatment<br />
Microscopy<br />
Astronomy<br />
Utilities<br />
Databases (XCEDE?)<br />
Other<br />
<br />
Options users might want to specify when building:<br />
src install vs. binary download<br />
version #'s of libs (e.g. cvs tags or branches to use)<br />
release build vs debug build<br />
clean rebuild<br />
update/refresh libraries<br />
run tests and submit to dashboard<br />
make an installation package<br />
upload to web site<br />
<br />
==== SVN branch ====<br />
<br />
http://www.na-mic.org/svn/Slicer3/branches/tgl_loadable_modules/<br />
<br />
==== References ====<br />
<br />
[[Slicer3:Execution_Model_Documentation]]<br />
<br />
[[Slicer3:How_to_implement_an_Interactive_Module_GUI]]</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:Loadable_Modules:Phase1&diff=22570Slicer3:Loadable Modules:Phase12008-03-04T02:29:46Z<p>TerryLorber: /* result of tele-conference 28jan2008 */</p>
<hr />
<div>From [[Slicer3:Loadable_Modules]]:<br />
* runtime module discovery<br />
* module template<br />
* like CommandLineModuleFactory <br />
<br />
----<br />
<br />
<br />
Starting at ~900 in Applications/GUI/Slicer3.cxx, static modules load occurs.<br />
<br />
Using vtkSys tools to list shared libraries present. Use itk::DyanmicLoader to open libraries and call our specified entry points.<br />
<br />
The actions taken for each module to be added could be queried from the found shared library using a LoadableModuleInfo class. Some of the information a library should provide:<br />
<br />
* vtkSlicerLogic pointer (maybe this is one of the defined entry points for a loadable module)<br />
* methods to call on the Logic pointer<br />
* vtkSlicerModulesGUI pointer (ditto)<br />
* methods to call on the GUI pointer<br />
* module name<br />
<br />
LoadableModuleFactory (dervie from? Libs/ModuleDescriptionParser/ModuleFactory.cxx) handles this. Looks like ModuleFactory::ScanForSharedObjectModules does something very similar.<br />
<br />
<br />
Create shared libraries for each of the static modules listed in Slicer3.cxx<br />
<br />
==== loadable modules entry points ====<br />
<br />
void* GetLoadableModuleGUI<br />
void* GetLoadableModuleLogic<br />
char* GetLoadableModuleDescription<br />
<br />
That might be it, it'd be nice to have the module describe the necessary methods to call on the GUI and Logic pointer, but that might be Phase I-A. Within Slicer3_main, there doesn't seem to be much variation.<br />
<br />
Slicer3.cxx also defines [modulename]_Init(Tcl_Interp* interp) functions and calls them for each module. Should this also be conditional for loadable modules? Does it require an additional entry point?<br />
<br />
==== loadable module support ====<br />
<br />
<br />
Is there a header/source file that should be added to every module? Can we follow the CLP methodology and use an XML source and CMake driven tool to generate the necessary files?<br />
<br />
===== result of tele-conference 28jan2008 =====<br />
<br />
Things that the module's XML description should be able to tell:<br />
Name<br />
Group<br />
Description<br />
Home Page<br />
Dependencies (on other Groups or Modules and what versions)<br />
Version #<br />
[and maybe:]<br />
icon<br />
Author(s)<br />
Acknowledgment(s)<br />
<br />
Module Groups for Slicer3:<br />
Base<br />
Segmentation<br />
Registration<br />
Filtering<br />
Diffusion Imaging/Tractography<br />
Modeling<br />
Meshing<br />
Image Guided Therapy<br />
Rendering<br />
Radiation Treatment<br />
Microscopy<br />
Astronomy<br />
Utilities<br />
Databases (XCEDE?)<br />
Other<br />
<br />
Options users might want to specify when building:<br />
src install vs. binary download<br />
version #'s of libs (e.g. cvs tags or branches to use)<br />
release build vs debug build<br />
clean rebuild<br />
update/refresh libraries<br />
run tests and submit to dashboard<br />
make an installation package<br />
upload to web site<br />
<br />
==== SVN branch ====<br />
<br />
http://www.na-mic.org/svn/Slicer3/branches/tgl_loadable_modules/<br />
<br />
==== References ====<br />
<br />
[[Slicer3:Execution_Model_Documentation]]<br />
<br />
[[Slicer3:How_to_implement_an_Interactive_Module_GUI]]</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:Loadable_Modules:Phase1&diff=22569Slicer3:Loadable Modules:Phase12008-03-04T02:28:49Z<p>TerryLorber: </p>
<hr />
<div>From [[Slicer3:Loadable_Modules]]:<br />
* runtime module discovery<br />
* module template<br />
* like CommandLineModuleFactory <br />
<br />
----<br />
<br />
<br />
Starting at ~900 in Applications/GUI/Slicer3.cxx, static modules load occurs.<br />
<br />
Using vtkSys tools to list shared libraries present. Use itk::DyanmicLoader to open libraries and call our specified entry points.<br />
<br />
The actions taken for each module to be added could be queried from the found shared library using a LoadableModuleInfo class. Some of the information a library should provide:<br />
<br />
* vtkSlicerLogic pointer (maybe this is one of the defined entry points for a loadable module)<br />
* methods to call on the Logic pointer<br />
* vtkSlicerModulesGUI pointer (ditto)<br />
* methods to call on the GUI pointer<br />
* module name<br />
<br />
LoadableModuleFactory (dervie from? Libs/ModuleDescriptionParser/ModuleFactory.cxx) handles this. Looks like ModuleFactory::ScanForSharedObjectModules does something very similar.<br />
<br />
<br />
Create shared libraries for each of the static modules listed in Slicer3.cxx<br />
<br />
==== loadable modules entry points ====<br />
<br />
void* GetLoadableModuleGUI<br />
void* GetLoadableModuleLogic<br />
char* GetLoadableModuleDescription<br />
<br />
That might be it, it'd be nice to have the module describe the necessary methods to call on the GUI and Logic pointer, but that might be Phase I-A. Within Slicer3_main, there doesn't seem to be much variation.<br />
<br />
Slicer3.cxx also defines [modulename]_Init(Tcl_Interp* interp) functions and calls them for each module. Should this also be conditional for loadable modules? Does it require an additional entry point?<br />
<br />
==== loadable module support ====<br />
<br />
<br />
Is there a header/source file that should be added to every module? Can we follow the CLP methodology and use an XML source and CMake driven tool to generate the necessary files?<br />
<br />
===== result of tele-conference 28jan2008 =====<br />
<br />
Things that the module's XML description should be able to tell:<br />
- Name<br />
- Group<br />
- Description<br />
- Home Page<br />
- Dependencies (on other Groups or Modules and what versions)<br />
- Version #<br />
[and maybe:]<br />
- icon<br />
- Author(s)<br />
- Acknowledgment(s)<br />
<br />
Module Groups for Slicer3:<br />
- Base<br />
- Segmentation<br />
- Registration<br />
- Filtering<br />
- Diffusion Imaging/Tractography<br />
- Modeling<br />
- Meshing<br />
- Image Guided Therapy<br />
- Rendering<br />
- Radiation Treatment<br />
- Microscopy<br />
- Astronomy<br />
- Utilities<br />
- Databases (XCEDE?)<br />
- Other<br />
<br />
Options users might want to specify when building:<br />
- src install vs. binary download<br />
- version #'s of libs (e.g. cvs tags or branches to use)<br />
- release build vs debug build<br />
- clean rebuild<br />
- update/refresh libraries<br />
- run tests and submit to dashboard<br />
- make an installation package<br />
- upload to web site<br />
<br />
==== SVN branch ====<br />
<br />
http://www.na-mic.org/svn/Slicer3/branches/tgl_loadable_modules/<br />
<br />
==== References ====<br />
<br />
[[Slicer3:Execution_Model_Documentation]]<br />
<br />
[[Slicer3:How_to_implement_an_Interactive_Module_GUI]]</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:Loadable_Modules:Phase1&diff=22177Slicer3:Loadable Modules:Phase12008-02-13T02:48:16Z<p>TerryLorber: /* loadable modules entry points */</p>
<hr />
<div>From [[Slicer3:Loadable_Modules]]:<br />
* runtime module discovery<br />
* module template<br />
* like CommandLineModuleFactory <br />
<br />
----<br />
<br />
<br />
Starting at ~900 in Applications/GUI/Slicer3.cxx, static modules load occurs.<br />
<br />
Using vtkSys tools to list shared libraries present. Use itk::DyanmicLoader to open libraries and call our specified entry points.<br />
<br />
The actions taken for each module to be added could be queried from the found shared library using a LoadableModuleInfo class. Some of the information a library should provide:<br />
<br />
* vtkSlicerLogic pointer (maybe this is one of the defined entry points for a loadable module)<br />
* methods to call on the Logic pointer<br />
* vtkSlicerModulesGUI pointer (ditto)<br />
* methods to call on the GUI pointer<br />
* module name<br />
<br />
LoadableModuleFactory (dervie from? Libs/ModuleDescriptionParser/ModuleFactory.cxx) handles this. Looks like ModuleFactory::ScanForSharedObjectModules does something very similar.<br />
<br />
<br />
Create shared libraries for each of the static modules listed in Slicer3.cxx<br />
<br />
==== loadable modules entry points ====<br />
<br />
void* GetLoadableModuleGUI<br />
void* GetLoadableModuleLogic<br />
char* GetLoadableModuleDescription<br />
<br />
That might be it, it'd be nice to have the module describe the necessary methods to call on the GUI and Logic pointer, but that might be Phase I-A. Within Slicer3_main, there doesn't seem to be much variation.<br />
<br />
Slicer3.cxx also defines [modulename]_Init(Tcl_Interp* interp) functions and calls them for each module. Should this also be conditional for loadable modules? Does it require an additional entry point?<br />
<br />
==== loadable module support ====<br />
<br />
<br />
Is there a header/source file that should be added to every module? Can we follow the CLP methodology and use an XML source and CMake driven tool to generate the necessary files?<br />
<br />
==== SVN branch ====<br />
<br />
http://www.na-mic.org/svn/Slicer3/branches/tgl_loadable_modules/<br />
<br />
==== References ====<br />
<br />
[[Slicer3:Execution_Model_Documentation]]<br />
<br />
[[Slicer3:How_to_implement_an_Interactive_Module_GUI]]</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:Loadable_Modules:Phase1&diff=22176Slicer3:Loadable Modules:Phase12008-02-13T02:31:03Z<p>TerryLorber: /* loadable modules entry points */</p>
<hr />
<div>From [[Slicer3:Loadable_Modules]]:<br />
* runtime module discovery<br />
* module template<br />
* like CommandLineModuleFactory <br />
<br />
----<br />
<br />
<br />
Starting at ~900 in Applications/GUI/Slicer3.cxx, static modules load occurs.<br />
<br />
Using vtkSys tools to list shared libraries present. Use itk::DyanmicLoader to open libraries and call our specified entry points.<br />
<br />
The actions taken for each module to be added could be queried from the found shared library using a LoadableModuleInfo class. Some of the information a library should provide:<br />
<br />
* vtkSlicerLogic pointer (maybe this is one of the defined entry points for a loadable module)<br />
* methods to call on the Logic pointer<br />
* vtkSlicerModulesGUI pointer (ditto)<br />
* methods to call on the GUI pointer<br />
* module name<br />
<br />
LoadableModuleFactory (dervie from? Libs/ModuleDescriptionParser/ModuleFactory.cxx) handles this. Looks like ModuleFactory::ScanForSharedObjectModules does something very similar.<br />
<br />
<br />
Create shared libraries for each of the static modules listed in Slicer3.cxx<br />
<br />
==== loadable modules entry points ====<br />
<br />
void* GetLoadableModuleGUI<br />
void* GetLoadableModuleLogic<br />
char* GetLoadableModuleDescription<br />
<br />
That might be it, it'd be nice to have the module describe the necessary methods to call on the GUI and Logic pointer, but that might be Phase I-A. Within Slicer3_main, there doesn't seem to be much variation.<br />
<br />
Slicer3.cxx also defines *_Init(Tcl_Interp* interp) functions and calls them for each module. Should this also be conditional for loadable modules? Does it require an additional entry point?<br />
<br />
==== loadable module support ====<br />
<br />
<br />
Is there a header/source file that should be added to every module? Can we follow the CLP methodology and use an XML source and CMake driven tool to generate the necessary files?<br />
<br />
==== SVN branch ====<br />
<br />
http://www.na-mic.org/svn/Slicer3/branches/tgl_loadable_modules/<br />
<br />
==== References ====<br />
<br />
[[Slicer3:Execution_Model_Documentation]]<br />
<br />
[[Slicer3:How_to_implement_an_Interactive_Module_GUI]]</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:Loadable_Modules:Phase1&diff=20852Slicer3:Loadable Modules:Phase12008-01-08T02:47:11Z<p>TerryLorber: </p>
<hr />
<div>From [[Slicer3:Loadable_Modules]]:<br />
* runtime module discovery<br />
* module template<br />
* like CommandLineModuleFactory <br />
<br />
----<br />
<br />
<br />
Starting at ~900 in Applications/GUI/Slicer3.cxx, static modules load occurs.<br />
<br />
Using vtkSys tools to list shared libraries present. Use itk::DyanmicLoader to open libraries and call our specified entry points.<br />
<br />
The actions taken for each module to be added could be queried from the found shared library using a LoadableModuleInfo class. Some of the information a library should provide:<br />
<br />
* vtkSlicerLogic pointer (maybe this is one of the defined entry points for a loadable module)<br />
* methods to call on the Logic pointer<br />
* vtkSlicerModulesGUI pointer (ditto)<br />
* methods to call on the GUI pointer<br />
* module name<br />
<br />
LoadableModuleFactory (dervie from? Libs/ModuleDescriptionParser/ModuleFactory.cxx) handles this. Looks like ModuleFactory::ScanForSharedObjectModules does something very similar.<br />
<br />
<br />
Create shared libraries for each of the static modules listed in Slicer3.cxx<br />
<br />
==== loadable modules entry points ====<br />
<br />
void* GetLoadableModuleGUI<br />
void* GetLoadableModuleLogic<br />
char* GetLoadableModuleDescription<br />
<br />
That might be it, it'd be nice to have the module describe the necessary methods to call on the GUI and Logic pointer, but that might be Phase I-A. Within Slicer3_main, there doesn't seem to be much variation.<br />
<br />
==== loadable module support ====<br />
<br />
<br />
Is there a header/source file that should be added to every module? Can we follow the CLP methodology and use an XML source and CMake driven tool to generate the necessary files?<br />
<br />
==== SVN branch ====<br />
<br />
http://www.na-mic.org/svn/Slicer3/branches/tgl_loadable_modules/<br />
<br />
==== References ====<br />
<br />
[[Slicer3:Execution_Model_Documentation]]<br />
<br />
[[Slicer3:How_to_implement_an_Interactive_Module_GUI]]</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:Loadable_Modules:Phase1&diff=20851Slicer3:Loadable Modules:Phase12008-01-08T02:40:22Z<p>TerryLorber: </p>
<hr />
<div>From [[Slicer3:Loadable_Modules]]:<br />
* runtime module discovery<br />
* module template<br />
* like CommandLineModuleFactory <br />
<br />
----<br />
<br />
<br />
Starting at ~900 in Applications/GUI/Slicer3.cxx, static modules load occurs.<br />
<br />
Using vtkSys tools to list shared libraries present. Use itk::DyanmicLoader to open libraries and call our specified entry points.<br />
<br />
The actions taken for each module to be added could be queried from the found shared library using a LoadableModuleInfo class. Some of the information a library should provide:<br />
<br />
* vtkSlicerLogic pointer (maybe this is one of the defined entry points for a loadable module)<br />
* methods to call on the Logic pointer<br />
* vtkSlicerModulesGUI pointer (ditto)<br />
* methods to call on the GUI pointer<br />
* module name<br />
<br />
LoadableModuleFactory (dervie from? Libs/ModuleDescriptionParser/ModuleFactory.cxx) handles this. Looks like ModuleFactory::ScanForSharedObjectModules does something very similar.<br />
<br />
<br />
Create shared libraries for each of the static modules listed in Slicer3.cxx<br />
<br />
==== loadable modules entry points ====<br />
<br />
void* GetLoadableModuleGUI<br />
void* GetLoadableModuleLogic<br />
char* GetLoadableModuleDescription<br />
<br />
That might be it, it'd be nice to have the module describe the necessary methods to call on the GUI and Logic pointer, but that might be Phase I-A. Within Slicer3_main, there doesn't seem to be much variation.<br />
<br />
==== loadable module support ====<br />
<br />
<br />
Is there a header/source file that should be added to every module? Can we follow the CLP methodology and use an XML source and CMake driven tool to generate the necessary files?<br />
<br />
==== References ====<br />
<br />
[[Slicer3:Execution_Model_Documentation]]<br />
<br />
[[Slicer3:How_to_implement_an_Interactive_Module_GUI]]</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:Loadable_Modules:Phase1&diff=20468Slicer3:Loadable Modules:Phase12008-01-03T04:39:01Z<p>TerryLorber: /* loadable modules entry points */</p>
<hr />
<div>From [[Slicer3:Loadable_Modules]]:<br />
* runtime module discovery<br />
* module template<br />
* like CommandLineModuleFactory <br />
<br />
----<br />
<br />
<br />
Starting at ~900 in Applications/GUI/Slicer3.cxx, static modules load occurs.<br />
<br />
Using vtkSys tools to list shared libraries present. Use itk::DyanmicLoader to open libraries and call our specified entry points.<br />
<br />
The actions taken for each module to be added could be queried from the found shared library using a LoadableModuleInfo class. Some of the information a library should provide:<br />
<br />
* vtkSlicerLogic pointer (maybe this is one of the defined entry points for a loadable module)<br />
* methods to call on the Logic pointer<br />
* vtkSlicerModulesGUI pointer (ditto)<br />
* methods to call on the GUI pointer<br />
* module name<br />
<br />
LoadableModuleFactory (dervie from? Libs/ModuleDescriptionParser/ModuleFactory.cxx) handles this. Looks like ModuleFactory::ScanForSharedObjectModules does something very similar.<br />
<br />
<br />
Create shared libraries for each of the static modules listed in Slicer3.cxx<br />
<br />
==== loadable modules entry points ====<br />
<br />
void* GetLoadableModuleGUI<br />
void* GetLoadableModuleLogic<br />
char* GetLoadableModuleDescription<br />
<br />
That might be it, it'd be nice to have the module describe the necessary methods to call on the GUI and Logic pointer, but that might be Phase I-A. Within Slicer3_main, there doesn't seem to be much variation.<br />
<br />
==== References ====<br />
<br />
[[Slicer3:Execution_Model_Documentation]]<br />
<br />
[[Slicer3:How_to_implement_an_Interactive_Module_GUI]]</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:Loadable_Modules:Phase1&diff=20467Slicer3:Loadable Modules:Phase12008-01-03T04:11:56Z<p>TerryLorber: /* loadable modules entry points */</p>
<hr />
<div>From [[Slicer3:Loadable_Modules]]:<br />
* runtime module discovery<br />
* module template<br />
* like CommandLineModuleFactory <br />
<br />
----<br />
<br />
<br />
Starting at ~900 in Applications/GUI/Slicer3.cxx, static modules load occurs.<br />
<br />
Using vtkSys tools to list shared libraries present. Use itk::DyanmicLoader to open libraries and call our specified entry points.<br />
<br />
The actions taken for each module to be added could be queried from the found shared library using a LoadableModuleInfo class. Some of the information a library should provide:<br />
<br />
* vtkSlicerLogic pointer (maybe this is one of the defined entry points for a loadable module)<br />
* methods to call on the Logic pointer<br />
* vtkSlicerModulesGUI pointer (ditto)<br />
* methods to call on the GUI pointer<br />
* module name<br />
<br />
LoadableModuleFactory (dervie from? Libs/ModuleDescriptionParser/ModuleFactory.cxx) handles this. Looks like ModuleFactory::ScanForSharedObjectModules does something very similar.<br />
<br />
<br />
Create shared libraries for each of the static modules listed in Slicer3.cxx<br />
<br />
==== loadable modules entry points ====<br />
<br />
void* LoadableModuleGUI<br />
void* LoadableModuleLogic<br />
char* LoadableModuleDescription<br />
<br />
That might be it, it'd be nice to have the module describe the necessary methods to call on the GUI and Logic pointer, but that might be Phase I-A. Within Slicer3_main, there doesn't seem to be much variation.<br />
<br />
==== References ====<br />
<br />
[[Slicer3:Execution_Model_Documentation]]<br />
<br />
[[Slicer3:How_to_implement_an_Interactive_Module_GUI]]</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:Loadable_Modules:Phase1&diff=20465Slicer3:Loadable Modules:Phase12008-01-03T03:55:46Z<p>TerryLorber: </p>
<hr />
<div>From [[Slicer3:Loadable_Modules]]:<br />
* runtime module discovery<br />
* module template<br />
* like CommandLineModuleFactory <br />
<br />
----<br />
<br />
<br />
Starting at ~900 in Applications/GUI/Slicer3.cxx, static modules load occurs.<br />
<br />
Using vtkSys tools to list shared libraries present. Use itk::DyanmicLoader to open libraries and call our specified entry points.<br />
<br />
The actions taken for each module to be added could be queried from the found shared library using a LoadableModuleInfo class. Some of the information a library should provide:<br />
<br />
* vtkSlicerLogic pointer (maybe this is one of the defined entry points for a loadable module)<br />
* methods to call on the Logic pointer<br />
* vtkSlicerModulesGUI pointer (ditto)<br />
* methods to call on the GUI pointer<br />
* module name<br />
<br />
LoadableModuleFactory (dervie from? Libs/ModuleDescriptionParser/ModuleFactory.cxx) handles this. Looks like ModuleFactory::ScanForSharedObjectModules does something very similar.<br />
<br />
<br />
Create shared libraries for each of the static modules listed in Slicer3.cxx<br />
<br />
==== loadable modules entry points ====<br />
<br />
void* ModuleGUI<br />
void* ModuleLogic<br />
<br />
<br />
That might be it, it'd be nice to have the module describe the necessary methods to call on the GUI and Logic pointer, but that might be Phase I-A. Within Slicer3_main, there doesn't seem to be much variation.<br />
<br />
==== References ====<br />
<br />
[[Slicer3:Execution_Model_Documentation]]<br />
<br />
[[Slicer3:How_to_implement_an_Interactive_Module_GUI]]</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:Loadable_Modules:Phase1&diff=20464Slicer3:Loadable Modules:Phase12008-01-03T03:47:00Z<p>TerryLorber: </p>
<hr />
<div>From [[Slicer3:Loadable_Modules]]:<br />
* runtime module discovery<br />
* module template<br />
* like CommandLineModuleFactory <br />
<br />
----<br />
<br />
<br />
Starting at ~900 in Applications/GUI/Slicer3.cxx, static modules load occurs.<br />
<br />
Using vtkSys tools to list shared libraries present. Use itk::DyanmicLoader to open libraries and call our specified entry points.<br />
<br />
The actions taken for each module to be added could be queried from the found shared library using a LoadableModuleInfo class. Some of the information a library should provide:<br />
<br />
* vtkSlicerLogic pointer (maybe this is one of the defined entry points for a loadable module)<br />
* methods to call on the Logic pointer<br />
* vtkSlicerModulesGUI pointer (ditto)<br />
* methods to call on the GUI pointer<br />
* module name<br />
<br />
LoadableModuleFactory (dervie from? Libs/ModuleDescriptionParser/ModuleFactory.cxx) handles this. Looks like ModuleFactory::ScanForSharedObjectModules does something very similar.<br />
<br />
<br />
Create shared libraries for each of the static modules listed in Slicer3.cxx<br />
<br />
<br />
==== References ====<br />
<br />
[[Slicer3:Execution_Model_Documentation]]<br />
<br />
[[Slicer3:How_to_implement_an_Interactive_Module_GUI]]</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer:Build_Instructions:MSVS9&diff=20046Slicer:Build Instructions:MSVS92007-12-22T15:03:29Z<p>TerryLorber: </p>
<hr />
<div>I had to add the following to slicer_variables.tcl '''and''' slicer_variables2.tcl:<br />
<br />
if { [file exists "c:/Program Files/Microsoft Visual Studio 9.0/Common7/IDE/VCExpress.exe"] } {<br />
set ::GENERATOR "Visual Studio 8 2005" <br />
set ::MAKE "c:/Program Files/Microsoft Visual Studio 9.0/Common7/IDE/VCExpress.exe"<br />
set ::COMPILER_PATH "c:/Program Files/Microsoft Visual Studio 9.0/VC/bin"<br />
}<br />
<br />
This after installing the latest Visual C++ 2008 Express Edition from http://www.microsoft.com/express/download/<br />
<br />
I also had to run the vcsetup.exe, then the PSDK installer, then vcsetup.exe a final time before getting a Studio directory.<br />
<br />
OK, this is not working. Going to try with "NMake Makefiles"<br />
<br />
Nope. Doesn't work that way either.<br />
<br />
CMake must not be compatible with the latest VCExpress, should be able to download VC++ 2005 [http://www.microsoft.com/express/2005/download/default.aspx here], but it's not cooperating. Found the old version at: [http://go.microsoft.com/fwlink/?LinkId=51410&amp;clcid=0x409 "VC++ 2005 here"]</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer:Build_Instructions:MSVS9&diff=20045Slicer:Build Instructions:MSVS92007-12-22T14:43:48Z<p>TerryLorber: </p>
<hr />
<div>I had to add the following to slicer_variables.tcl '''and''' slicer_variables2.tcl:<br />
<br />
if { [file exists "c:/Program Files/Microsoft Visual Studio 9.0/Common7/IDE/VCExpress.exe"] } {<br />
set ::GENERATOR "Visual Studio 8 2005" <br />
set ::MAKE "c:/Program Files/Microsoft Visual Studio 9.0/Common7/IDE/VCExpress.exe"<br />
set ::COMPILER_PATH "c:/Program Files/Microsoft Visual Studio 9.0/VC/bin"<br />
}<br />
<br />
This after installing the latest Visual C++ 2008 Express Edition from http://www.microsoft.com/express/download/<br />
<br />
I also had to run the vcsetup.exe, then the PSDK installer, then vcsetup.exe a final time before getting a Studio directory.<br />
<br />
OK, this is not working. Going to try with "NMake Makefiles"<br />
<br />
Nope. Doesn't work that way either.<br />
<br />
CMake must not be compatible with the latest VCExpress, should be able to download VC++ 2005 [http://www.microsoft.com/express/2005/download/default.aspx here], but it's not cooperating.<br />
<br />
[http://go.microsoft.com/fwlink/?LinkId=51410&amp;clcid=0x409 "VC++ 2005 here"]</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer:Build_Instructions:MSVS9&diff=20044Slicer:Build Instructions:MSVS92007-12-22T14:28:05Z<p>TerryLorber: </p>
<hr />
<div>I had to add the following to slicer_variables.tcl '''and''' slicer_variables2.tcl:<br />
<br />
if { [file exists "c:/Program Files/Microsoft Visual Studio 9.0/Common7/IDE/VCExpress.exe"] } {<br />
set ::GENERATOR "Visual Studio 8 2005" <br />
set ::MAKE "c:/Program Files/Microsoft Visual Studio 9.0/Common7/IDE/VCExpress.exe"<br />
set ::COMPILER_PATH "c:/Program Files/Microsoft Visual Studio 9.0/VC/bin"<br />
}<br />
<br />
This after installing the latest Visual C++ 2008 Express Edition from http://www.microsoft.com/express/download/<br />
<br />
I also had to run the vcsetup.exe, then the PSDK installer, then vcsetup.exe a final time before getting a Studio directory.<br />
<br />
UPDATE: OK, this is not working. Going to try with "NMake Makefiles"<br />
<br />
<br />
UPDATE1: Nope. Doesn't work that way either.<br />
<br />
<br />
UPDATE2: CMake must not be compatible with the latest VCExpress, should be able to download VC++ 2005 [hhttp://www.microsoft.com/express/2005/download/default.aspx here Express2005], but it's not cooperating.</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer:Build_Instructions:MSVS9&diff=20043Slicer:Build Instructions:MSVS92007-12-22T06:59:10Z<p>TerryLorber: </p>
<hr />
<div>I had to add the following to slicer_variables.tcl '''and''' slicer_variables2.tcl:<br />
<br />
if { [file exists "c:/Program Files/Microsoft Visual Studio 9.0/Common7/IDE/VCExpress.exe"] } {<br />
set ::GENERATOR "Visual Studio 8 2005" <br />
set ::MAKE "c:/Program Files/Microsoft Visual Studio 9.0/Common7/IDE/VCExpress.exe"<br />
set ::COMPILER_PATH "c:/Program Files/Microsoft Visual Studio 9.0/VC/bin"<br />
}<br />
<br />
This after installing the latest Visual C++ 2008 Express Edition from http://www.microsoft.com/express/download/<br />
<br />
I also had to run the vcsetup.exe, then the PSDK installer, then vcsetup.exe a final time before getting a Studio directory.<br />
<br />
UPDATE: OK, this is not working. Going to try with "NMake Makefiles"<br />
<br />
<br />
UPDATE1: Nope. Doesn't work that way either.</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer:Build_Instructions:MSVS9&diff=20042Slicer:Build Instructions:MSVS92007-12-22T06:55:08Z<p>TerryLorber: </p>
<hr />
<div>I had to add the following to slicer_variables.tcl '''and''' slicer_variables2.tcl:<br />
<br />
if { [file exists "c:/Program Files/Microsoft Visual Studio 9.0/Common7/IDE/VCExpress.exe"] } {<br />
set ::GENERATOR "Visual Studio 8 2005" <br />
set ::MAKE "c:/Program Files/Microsoft Visual Studio 9.0/Common7/IDE/VCExpress.exe"<br />
set ::COMPILER_PATH "c:/Program Files/Microsoft Visual Studio 9.0/VC/bin"<br />
}<br />
<br />
This after installing the latest Visual C++ 2008 Express Edition from http://www.microsoft.com/express/download/<br />
<br />
I also had to run the vcsetup.exe, then the PSDK installer, then vcsetup.exe a final time before getting a Studio directory.<br />
<br />
UPDATE: OK, this is not working. Going to try with "NMake Makefiles"</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer:Build_Instructions:MSVS9&diff=20041Slicer:Build Instructions:MSVS92007-12-22T06:52:10Z<p>TerryLorber: </p>
<hr />
<div>I had to add the following to slicer_variables.tcl '''and''' slicer_variables2.tcl:<br />
<br />
if { [file exists "c:/Program Files/Microsoft Visual Studio 9.0/Common7/IDE/VCExpress.exe"] } {<br />
set ::GENERATOR "Visual Studio 8 2005" <br />
set ::MAKE "c:/Program Files/Microsoft Visual Studio 9.0/Common7/IDE/VCExpress.exe"<br />
set ::COMPILER_PATH "c:/Program Files/Microsoft Visual Studio 9.0/VC/bin"<br />
}<br />
<br />
This after installing the latest Visual C++ 2008 Express Edition from http://www.microsoft.com/express/download/<br />
<br />
I also had to run the vcsetup.exe, then the PSDK installer, then vcsetup.exe a final time before getting a Studio directory.</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer:Build_Instructions:MSVS9&diff=20040Slicer:Build Instructions:MSVS92007-12-22T06:46:43Z<p>TerryLorber: </p>
<hr />
<div>I had to add the following to slicer_variables.tcl '''and''' slicer_variables2.tcl:<br />
<br />
if { [file exists "c:/Program Files/Microsoft Visual Studio 9.0/Common7/IDE/VCExpress.exe"] } {<br />
set ::GENERATOR "Visual Studio 8 2005" <br />
set ::MAKE "c:/Program Files/Microsoft Visual Studio 9.0/Common7/IDE/VCExpress.exe"<br />
set ::COMPILER_PATH "c:/Program Files/Microsoft Visual Studio 9.0/VC/bin"<br />
}<br />
<br />
This after installing the latest Visual C++ 2008 Express Edition from http://www.microsoft.com/express/download/<br />
<br />
I also had to run the vcsetup.exe, then the PSDK installer, then vcsetup.exe a final time before getting a Studio directory.<br />
<br />
<br />
UPDATE: ...this isn't really working.</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer:Build_Instructions:MSVS9&diff=20039Slicer:Build Instructions:MSVS92007-12-22T06:38:12Z<p>TerryLorber: </p>
<hr />
<div>I had to add the following to slicer_variables.tcl for getbuildtest.tcl to work:<br />
<br />
if { [file exists "c:/Program Files/Microsoft Visual Studio 9.0/Common7/IDE/VCExpress.exe"] } {<br />
set ::GENERATOR "Visual Studio 8 2005" <br />
set ::MAKE "c:/Program Files/Microsoft Visual Studio 9.0/Common7/IDE/VCExpress.exe"<br />
set ::COMPILER_PATH "c:/Program Files/Microsoft Visual Studio 9.0/VC/bin"<br />
}<br />
<br />
This after installing the latest Visual C++ 2008 Express Edition from http://www.microsoft.com/express/download/<br />
<br />
I also had to run the vcsetup.exe, then the PSDK installer, then vcsetup.exe a final time before getting a Studio directory.<br />
<br />
<br />
UPDATE: ...this isn't really working.</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer:Build_Instructions:MSVS9&diff=20038Slicer:Build Instructions:MSVS92007-12-22T06:25:11Z<p>TerryLorber: </p>
<hr />
<div>I had to add the following to slicer_variables.tcl for getbuildtest.tcl to work:<br />
<br />
if { [file exists "c:/Program Files/Microsoft Visual Studio 9.0/Common7/IDE/VCExpress.exe"] } {<br />
set ::GENERATOR "Visual Studio 8 2005" <br />
set ::MAKE "c:/Program Files/Microsoft Visual Studio 9.0/Common7/IDE/VCExpress.exe"<br />
set ::COMPILER_PATH "c:/Program Files/Microsoft Visual Studio 9.0/VC/bin"<br />
}<br />
<br />
This after installing the latest Visual C++ 2008 Express Edition from http://www.microsoft.com/express/download/<br />
<br />
I also had to run the vcsetup.exe, then the PSDK installer, then vcsetup.exe a final time before getting a Studio directory.</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer:Build_Instructions:MSVS9&diff=20037Slicer:Build Instructions:MSVS92007-12-22T06:20:28Z<p>TerryLorber: New page: I had to add the following to slicer_variables.tcl for getbuildtest.tcl to work: if { [file exists "c:/Program Files/Microsoft Visual Studio 9.0/Common7/IDE/VCExpress.exe"] } { ...</p>
<hr />
<div>I had to add the following to slicer_variables.tcl for getbuildtest.tcl to work:<br />
<br />
<br />
if { [file exists "c:/Program Files/Microsoft Visual Studio 9.0/Common7/IDE/VCExpress.exe"] } {<br />
set ::GENERATOR "Visual Studio 9.0" <br />
set ::MAKE "c:/Program Files/Microsoft Visual Studio 9.0/Common7/IDE/VCExpress.exe"<br />
set ::COMPILER_PATH "c:/Program Files/Microsoft Visual Studio 9.0/VC/bin"<br />
}<br />
<br />
This after installing the latest Visual C++ 2008 Express Edition from http://www.microsoft.com/express/download/<br />
<br />
I also had to run the vcsetup.exe, then the PSDK installer, then vcsetup.exe a final time before getting a Studio directory.</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:Build_Instructions&diff=20036Slicer3:Build Instructions2007-12-22T06:17:22Z<p>TerryLorber: /* getbuildtest on windows */</p>
<hr />
<div>= All-in-one Script to checkout and build Slicer3 =<br />
<br />
There's a script called getbuildtest.tcl that makes the support libraries (VTK, ITK, teem, etc) and also builds slicer and does a dashboard submission. (Click [[Slicer3:getbuildtest | here for background on getbuildtest]] and the experimental getbuildtest2 version).<br />
<br />
Just do the following two commands (see [[Slicer3:Build_Instructions#getbuildtest_on_windows|for windows users]] below):<br />
<br />
<br />
svn co http://www.na-mic.org/svn/Slicer3/trunk Slicer3<br />
<br />
./Slicer3/Scripts/getbuildtest.tcl<br />
<br />
<br /> Note: that a Slicer3-lib and Slicer3-build directory will be created for you. This is meant to be used to set up new machines and to run nightly testing of the full builds.<br />
<br />
To run (all platforms):<br />
<br />
./Slicer3-build/Slicer3<br />
<br />
Note: the whole build environment takes about 2G of disk space.<br />
<br />
== Testing ==<br />
<br />
Note also that getbuildtest will do an Experimental submission to the [http://www.na-mic.org/Slicer3/Dashboard/ Slicer3 dashboard]. If you want to use getbuildtest without submitting to the dashboard, you can set the test type to nothing with<br />
<br />
getbuildtest.tcl -t ""<br />
<br />
Other options for the -t (--test-type) option are Nightly or Continuous (or any of the [http://www.cmake.org/Wiki/CMake_Testing_With_CTest CTest] options).<br />
<br />
== What does getbuildtest.tcl do? ==<br />
<br />
This script just automates the steps needed to build slicer. What you end up with is a set of source and build directories that can either be further manipulated with getbuildtest or can be worked with normally. That is, on windows you will have solution files that you can load in visual studio for debugging and further development.<br />
<br />
Specifically, getbuildtest does the following steps:<br />
<br />
* Refreshes Slicer3 svn<br />
* Runs Scripts/genlib.tcl which does the following for each of the support libraries<br />
** does a cvs/svn checkout/update<br />
** runs cmake with the correct settings for use with Slicer3<br />
** runs make (or developer studio) to build the libraries<br />
* Runs cmake on Slicer3<br />
* Builds Slicer3<br />
* Runs ctest on Slicer3<br />
* (optionally) Runs CPack on Slicer3<br />
<br />
== Usage ==<br />
<br />
Usage:<br />
<br />
usage: getbuildtest [options] [target]<br />
[target] is determined automatically if not specified<br />
[options] is one of the following:<br />
--help : prints this message and exits<br />
--clean : delete lib and build directories first<br />
-t --test-type : CTest test target<br />
--release : compile with optimization flags<br />
--update : does a cvs/svn update on each lib<br />
--pack : builds a distribution package (cpack)<br />
<br />
== Errors from getbuildtest ==<br />
<br />
You will need to have your firewall configured to allow access to na-mic.org for cvs access through port 2401. Also you need 8081 for submitting to the dashboard.<br />
<br />
Other errors might mean you don't have all the build tools (see next section).<br />
<br />
If you want to generate a log of the build process, you can use a command like the following:<br />
<br />
# for csh/tcsh:<br />
./Scripts/getbuildtest.tcl |& tee build.log<br />
or<br />
# for sh/bash:<br />
./Scripts/getbuildtest.tcl 2>&1 | tee build.log<br />
<br />
== Updating Your getbuildtest Build ==<br />
<br />
There are a few options:<br />
<br />
* you can re-run getbuildtest and it will update slicer3 and rebuild (just slicer3)<br />
* you can add the --update option and all the libs will get a cvs/svn update and will rebuild if needed (good for tracking the development head of VTK/ITK/KWWidgets etc).<br />
* you can just 'svn update' in the Slicer3 directory and then do 'make' in the Slicer3-build to get just the latest Slicer3 code.<br />
<br />
The following command for unix machines will update, build, and launch the latest Slicer3:<br />
<br />
svn update && (cd ../Slicer3-build; make && ./bin/Slicer3)<br />
<br />
<br /><br />
<br />
== getbuildtest on linux ==<br />
<br />
To compile slicer and do development, be sure you have a complete set of development packages installed on your machine. The exact packages vary by distribution, but include:<br />
* gcc<br />
* gcc-c++<br />
* libX11 <br />
* libX11-devel (libX11-dev on Ubuntu 7.04)<br />
* libXt-devel (libXt-dev on Ubuntu)<br />
* opengl/mesa (libgl1-mesa-dev on Ubuntu)<br />
<br />
Ubuntu one line install:<br />
<br />
sudo apt-get install subversion cvs tcl8.4 gcc g++ libX11-dev libXt-dev libxext-dev libgl1-mesa-dev libncurses5-dev tcsh<br />
<br />
<br />
Also, be sure you have OpenGL and the GLX extension to X working. To check the installation, it is usually enough to confirm that the command <pre>glxgears</pre> runs with no errors.<br />
<br />
== getbuildtest on windows ==<br />
<br />
The script should work fine on a properly configured windows environment. Current requirements are:<br />
<br />
* Developer Studio 8 Visual C++ Express which is free from Microsoft - be sure to install the Platform SDK and follow the ridiculous manual steps to set up the paths [[Slicer3:Build_Instructions#Information_on_Free_Microsoft_C.2B.2B_Compiler_on_Windows|see below]].<br />
* Developer Studio 9 Visual C++ Express [[Slicer:Build_Instructions:MSVS9]]<br />
** Other releases of visual studio also work (7 and 7.1)<br />
** If they are installed in the default locations in "c:/Program Files" they will be detected by the build script automatically (you need to edit slicer_variables.tcl to point to the installation).<br />
* [http://www.cygwin.com Cygwin] with the following packages<br />
** tcltk<br />
** svn<br />
** cvs<br />
** unzip<br />
** curl<br />
* With Developers Studio and cygwin installed, you only need to do the svn checkout and getbuildtest script to get a fully working Slicer3 plus all the tools you need to develop new code.<br />
<br />
Note: CMake and VTK will not work on a FAT formatted disk (use NTFS).<br />
<br />
== getbuildtest on Apple Mac OS X ==<br />
<br />
For Mac OS 10.4.10 install the following from the OS disks (not installed by default on new machines):<br />
* Xcode Tools (OS Disk 1, default window)<br />
* X11: also on OS Disk 1, but you need to scroll down and find the Optional Installs installer and select X11 under Applications. See [http://porting.openoffice.org/mac/faq/installing/X11.html step-by-step instructions].<br />
* X11SDK - from OS Disk 1, Xcode Tools/Packages/X11SDK.pkg<br />
* Subversion. Installation [http://downloads.open.collab.net/binaries.html options here]. Get the latest svn version for compatibility with the server and be sure your client includes SSL (so it can access https repositories).<br />
<br />
Remember to run getbuildtest from an xterm so the tests can access the X server.<br />
<br />
== configuration options ==<br />
<br />
The file Slicer3/slicer_variables.tcl includes configuration options for which support libraries to use. You may want to change thes for testing or to get access to new functionality. <br />
<br />
set ::SLICER_TAG "http://www.na-mic.org/svn/Slicer3/trunk"<br />
set ::CMAKE_TAG "CMake-2-4-2"<br />
set ::TEEM_TAG "Teem-1-9-0-patches"<br />
set ::KWWidgets_TAG "HEAD"<br />
set ::VTK_TAG "VTK-5-0"<br />
set ::ITK_TAG ITK-3-0<br />
set ::TCL_TAG "core-8-4-6"<br />
set ::TK_TAG "core-8-4-6"<br />
set ::ITCL_TAG "itcl-3-2-1"<br />
set ::IWIDGETS_TAG "iwidgets-4-0-1"<br />
set ::BLT_TAG "blt24z"<br />
set ::SANDBOX_TAG "http://svn.na-mic.org/svn/NAMICSandBox/branches/Slicer-2-6"<br />
<br />
For example, you may want a build against the ITK cvs head. Change the flag value and then run <br />
<br />
getbuildtest.tcl --update <br />
<br />
which will get the version from cvs, build it, and rebuild slicer3. Depending on how radically different the versions you build are, you may need to use --clean.<br />
<br />
Another useful option is to change your build type to include support debugging.<br />
<br />
set ::VTK_BUILD_TYPE "RelWithDebInfo"<br />
<br />
options are Debug, Release, or RelWithDebInfo. RelWithDebInfo is a compromise between speed and debuggability. If you are tracking down a tough C++ bug you will get better information in Debug mode. After changing this flag, you should run<br />
<br />
getbuildtest.tcl --clean<br />
<br />
to create a completely new build.<br />
<br />
= Manual checkout/build of Slicer3 and support libraries: =<br />
<br />
== Prerequisite software ==<br />
<br />
You need to get and build the following packages if you aren't using the getbuildtest script:<br />
<br />
# [http://www.cmake.org CMake (2.4.1 or later)]<br />
# [http://www.tcl.tk Tcl/Tk (8.4 or later)]<br />
# [http://sourceforge.net/projects/incrtcl/ incrTcl (3.2.1)]<br />
# [http://www.vtk.org VTK 5.0]<br />
# [http://www.itk.org ITK 3.4]<br />
# [http://www.kwwidgets.org KWWidgets Slicer-3-0 tag]<br />
# [http://teem.sf.net Teem (1.9.0)]<br />
<br />
== Build Steps ==<br />
<br />
Steps:<br />
<br />
$ svn co http://www.na-mic.org/svn/Slicer3/trunk Slicer3<br />
$ cvs -d :pserver:anoncvs@www.vtk.org:/cvsroot/VTK co VTK -r VTK-5-0<br />
$ cvs -d :pserver:anoncvs@www.itk.org:/cvsroot/Insight co Insight -r ITK-3-4<br />
$ cvs -d :pserver:anoncvs@www.kwwidgets.org:/cvsroot/KWWidgets co KWWidgets -r Slicer-3-0<br />
<br />
<br />
=== Configure and build ITK ===<br />
<br />
* BUILD_SHARED_LIBS ON<br />
* CMAKE_SKIP_RPATH ON<br />
<br />
=== Configure and build VTK ===<br />
<br />
* All systems:<br />
** BUILD_SHARED_LIBS ON<br />
** CMAKE_SKIP_RPATH ON<br />
** VTK_WRAP_TCL ON<br />
** VTK_DEBUG_LEAKS ON<br />
<br />
<br /><br />
<br />
* MacOSX specific (Make sure to install [http://www.apple.com/downloads/macosx/apple/x11formacosx.html X11]):<br />
** VTK_USE_CARBON OFF<br />
** VTK_USE_X ON<br />
<br />
<br /><br />
<br />
* Note, those options '''should not''' appear, since they disapear since VTK5:<br />
** VTK_USE_HYBRID ON<br />
** VTK_USE_PATENTED ON<br />
<br />
* Make sure that the TCL and TK path are set properly<br />
** TCL_* and TK_*<br />
<br />
=== Configure and build KWWidgets ===<br />
<br />
* You need to specify where your VTK build tree is.<br />
* BUILD_SHARED_LIBS ON<br />
* CMAKE_SKIP_RPATH ON<br />
<br />
== Build and Run Slicer3 ==<br />
<br />
=== Manually ===<br />
<br />
# Check out and build slicer3 (e.g. on linux)<br />
<br />
svn co http://www.na-mic.org/svn/Slicer3/trunk Slicer3<br />
mkdir Slicer3-build<br />
cd Slicer3-build<br />
ccmake ../Slicer3<br />
make<br />
<br />
Again make sure to turn:<br />
<br />
* BUILD_SHARED_LIBS ON<br />
* CMAKE_SKIP_RPATH ON<br />
<br />
<br /> Start slicer with the Slicer3 executable in your build directory.<br />
<br />
= Links =<br />
<br />
* http://www.na-mic.org/Wiki/index.php/Slicer3<br />
* http://www.na-mic.org/websvn/listing.php?repname=Slicer3<br />
* [[Slicer3::Eclipse | Howto integrate Slicer3 into Eclipse]]<br />
== Information on Free Microsoft C++ Compiler on Windows ==<br />
<br />
Be sure to follow '''all''' the steps on Microsoft link. Yes it means you need to download the compiler '''and''' sdk.<br />
<br />
* http://msdn.microsoft.com/vstudio/express/visualc/usingpsdk/</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:getbuildtest:macosx10.5&diff=19636Slicer3:getbuildtest:macosx10.52007-12-16T18:49:55Z<p>TerryLorber: </p>
<hr />
<div>MAC OS X 10.4 works great, but on 10.5 getting a configure error for [incr Tcl]:<br />
<br />
<br />
running: ../incrTcl/configure --with-tcl=/Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build/lib --with-tk=/Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build/lib --prefix=/Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build<br />
loading cache ./config.cache<br />
creating ./config.status<br />
creating Makefile<br />
configuring in itcl<br />
running /bin/sh ../../incrTcl/itcl/configure --with-tcl=/Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build/lib --with-tk=/Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build/lib --prefix=/Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build --cache-file=.././config.cache --srcdir=../../incrTcl/itcl<br />
loading cache .././config.cache<br />
checking for gcc... cc<br />
checking whether the C compiler (cc ) works... yes<br />
checking whether the C compiler (cc ) is a cross-compiler... no<br />
checking whether we are using GNU C... yes<br />
checking whether cc accepts -g... yes<br />
checking for a BSD compatible install... /usr/bin/install -c<br />
checking whether make sets ${MAKE}... yes<br />
checking for ranlib... ranlib<br />
checking for Cygwin environment... no<br />
checking for object suffix... o<br />
checking for mingw32 environment... no<br />
checking for executable suffix... rm: conftest.dSYM: is a directory<br />
.dSYM<br />
checking for Tcl configuration... found /Users/tgl/workspace/Slicer3-lib/tcl-build/lib/tclConfig.sh<br />
checking for existence of /Users/tgl/workspace/Slicer3-lib/tcl-build/lib/tclConfig.sh... loading<br />
checking for Tcl private include files... Using srcdir found in tclConfig.sh: /Users/tgl/workspace/Slicer3-lib/tcl/tcl<br />
checking for building with threads... no (default)<br />
checking how to build libraries... shared<br />
checking for build with symbols... no<br />
checking for tclsh... configure: error: No tclsh found in PATH: /Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build/bin /Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build/bin /Users/tgl/workspace/Slicer3-lib/tcl-build/lib /Users/tgl/workspace/Slicer3-lib/tcl-build/lib/../bin /opt/local/bin /opt/local/sbin /usr/bin /bin /usr/sbin /sbin /usr/local/bin /usr/X11/bin<br />
configure: error: ../../incrTcl/itcl/configure failed for itcl<br />
<br />
child process exited abnormally<br />
1<br />
while executing<br />
"error $ret"<br />
(procedure "runcmd" line 23)<br />
invoked from within<br />
"runcmd ../incrTcl/configure --with-tcl=$SLICER_LIB/tcl-build/lib --with-tk=$SLICER_LIB/tcl-build/lib --prefix=$SLICER_LIB/tcl-build"<br />
invoked from within<br />
"if { ![file exists $::ITCL_TEST_FILE] || $::GENLIB(update) } {<br />
cd $SLICER_LIB/tcl <br />
<br />
runcmd $::CVS -d :pserver:anonymous:bwhspl@cvs.spl.harvard...."<br />
(file "./Scripts/genlib.tcl" line 359)<br />
<br />
child process exited abnormally <br />
1<br />
while executing <br />
"error $ret"<br />
(procedure "runcmd" line 23)<br />
invoked from within<br />
"runcmd sh ./Scripts/genlib.tcl /Users/tgl/workspace/Slicer3/../Slicer3-lib"<br />
("eval" body line 1)<br />
invoked from within<br />
"eval runcmd $cmd"<br />
(file "./Slicer3/Scripts/getbuildtest.tcl" line 294) <br />
<br />
<br />
<br />
$ ./Slicer3-lib/tcl/incrTcl/configure <br />
loading cache ./config.cache<br />
checking for prefix by checking for itclsh... (cached) /usr/bin/tclsh<br />
creating ./config.status<br />
creating Makefile<br />
configuring in itcl<br />
running /bin/sh .././Slicer3-lib/tcl/incrTcl/itcl/configure --cache-file=.././config.cache --srcdir=.././Slicer3-lib/tcl/incrTcl/itcl<br />
loading cache .././config.cache<br />
checking for gcc... cc<br />
checking whether the C compiler (cc ) works... yes<br />
checking whether the C compiler (cc ) is a cross-compiler... no<br />
checking whether we are using GNU C... yes<br />
checking whether cc accepts -g... yes<br />
checking for a BSD compatible install... /usr/bin/install -c<br />
checking whether make sets ${MAKE}... yes<br />
checking for ranlib... ranlib<br />
checking for Cygwin environment... no<br />
checking for object suffix... o<br />
checking for mingw32 environment... no<br />
checking for executable suffix... rm: conftest.dSYM: is a directory<br />
.dSYM<br />
checking for Tcl configuration... configure: warning: Can't find Tcl configuration definitions<br />
configuring in itk<br />
running /bin/sh .././Slicer3-lib/tcl/incrTcl/itk/configure --cache-file=.././config.cache --srcdir=.././Slicer3-lib/tcl/incrTcl/itk<br />
loading cache .././config.cache<br />
checking for gcc... cc<br />
checking whether the C compiler (cc ) works... yes<br />
checking whether the C compiler (cc ) is a cross-compiler... no<br />
checking whether we are using GNU C... yes<br />
checking whether cc accepts -g... yes<br />
checking for a BSD compatible install... /usr/bin/install -c<br />
checking whether make sets ${MAKE}... yes<br />
checking for ranlib... ranlib<br />
checking for Cygwin environment... no<br />
checking for object suffix... o<br />
checking for mingw32 environment... no<br />
checking for executable suffix... rm: conftest.dSYM: is a directory<br />
.dSYM<br />
checking for Tcl configuration... configure: warning: Can't find Tcl configuration definitions</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:getbuildtest:macosx10.5&diff=19635Slicer3:getbuildtest:macosx10.52007-12-16T18:49:19Z<p>TerryLorber: </p>
<hr />
<div>MAC OS X 10.4 works great, currently getting a configure error for [incr Tcl]:<br />
<br />
<br />
running: ../incrTcl/configure --with-tcl=/Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build/lib --with-tk=/Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build/lib --prefix=/Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build<br />
loading cache ./config.cache<br />
creating ./config.status<br />
creating Makefile<br />
configuring in itcl<br />
running /bin/sh ../../incrTcl/itcl/configure --with-tcl=/Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build/lib --with-tk=/Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build/lib --prefix=/Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build --cache-file=.././config.cache --srcdir=../../incrTcl/itcl<br />
loading cache .././config.cache<br />
checking for gcc... cc<br />
checking whether the C compiler (cc ) works... yes<br />
checking whether the C compiler (cc ) is a cross-compiler... no<br />
checking whether we are using GNU C... yes<br />
checking whether cc accepts -g... yes<br />
checking for a BSD compatible install... /usr/bin/install -c<br />
checking whether make sets ${MAKE}... yes<br />
checking for ranlib... ranlib<br />
checking for Cygwin environment... no<br />
checking for object suffix... o<br />
checking for mingw32 environment... no<br />
checking for executable suffix... rm: conftest.dSYM: is a directory<br />
.dSYM<br />
checking for Tcl configuration... found /Users/tgl/workspace/Slicer3-lib/tcl-build/lib/tclConfig.sh<br />
checking for existence of /Users/tgl/workspace/Slicer3-lib/tcl-build/lib/tclConfig.sh... loading<br />
checking for Tcl private include files... Using srcdir found in tclConfig.sh: /Users/tgl/workspace/Slicer3-lib/tcl/tcl<br />
checking for building with threads... no (default)<br />
checking how to build libraries... shared<br />
checking for build with symbols... no<br />
checking for tclsh... configure: error: No tclsh found in PATH: /Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build/bin /Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build/bin /Users/tgl/workspace/Slicer3-lib/tcl-build/lib /Users/tgl/workspace/Slicer3-lib/tcl-build/lib/../bin /opt/local/bin /opt/local/sbin /usr/bin /bin /usr/sbin /sbin /usr/local/bin /usr/X11/bin<br />
configure: error: ../../incrTcl/itcl/configure failed for itcl<br />
<br />
child process exited abnormally<br />
1<br />
while executing<br />
"error $ret"<br />
(procedure "runcmd" line 23)<br />
invoked from within<br />
"runcmd ../incrTcl/configure --with-tcl=$SLICER_LIB/tcl-build/lib --with-tk=$SLICER_LIB/tcl-build/lib --prefix=$SLICER_LIB/tcl-build"<br />
invoked from within<br />
"if { ![file exists $::ITCL_TEST_FILE] || $::GENLIB(update) } {<br />
cd $SLICER_LIB/tcl <br />
<br />
runcmd $::CVS -d :pserver:anonymous:bwhspl@cvs.spl.harvard...."<br />
(file "./Scripts/genlib.tcl" line 359)<br />
<br />
child process exited abnormally <br />
1<br />
while executing <br />
"error $ret"<br />
(procedure "runcmd" line 23)<br />
invoked from within<br />
"runcmd sh ./Scripts/genlib.tcl /Users/tgl/workspace/Slicer3/../Slicer3-lib"<br />
("eval" body line 1)<br />
invoked from within<br />
"eval runcmd $cmd"<br />
(file "./Slicer3/Scripts/getbuildtest.tcl" line 294) <br />
<br />
<br />
<br />
$ ./Slicer3-lib/tcl/incrTcl/configure <br />
loading cache ./config.cache<br />
checking for prefix by checking for itclsh... (cached) /usr/bin/tclsh<br />
creating ./config.status<br />
creating Makefile<br />
configuring in itcl<br />
running /bin/sh .././Slicer3-lib/tcl/incrTcl/itcl/configure --cache-file=.././config.cache --srcdir=.././Slicer3-lib/tcl/incrTcl/itcl<br />
loading cache .././config.cache<br />
checking for gcc... cc<br />
checking whether the C compiler (cc ) works... yes<br />
checking whether the C compiler (cc ) is a cross-compiler... no<br />
checking whether we are using GNU C... yes<br />
checking whether cc accepts -g... yes<br />
checking for a BSD compatible install... /usr/bin/install -c<br />
checking whether make sets ${MAKE}... yes<br />
checking for ranlib... ranlib<br />
checking for Cygwin environment... no<br />
checking for object suffix... o<br />
checking for mingw32 environment... no<br />
checking for executable suffix... rm: conftest.dSYM: is a directory<br />
.dSYM<br />
checking for Tcl configuration... configure: warning: Can't find Tcl configuration definitions<br />
configuring in itk<br />
running /bin/sh .././Slicer3-lib/tcl/incrTcl/itk/configure --cache-file=.././config.cache --srcdir=.././Slicer3-lib/tcl/incrTcl/itk<br />
loading cache .././config.cache<br />
checking for gcc... cc<br />
checking whether the C compiler (cc ) works... yes<br />
checking whether the C compiler (cc ) is a cross-compiler... no<br />
checking whether we are using GNU C... yes<br />
checking whether cc accepts -g... yes<br />
checking for a BSD compatible install... /usr/bin/install -c<br />
checking whether make sets ${MAKE}... yes<br />
checking for ranlib... ranlib<br />
checking for Cygwin environment... no<br />
checking for object suffix... o<br />
checking for mingw32 environment... no<br />
checking for executable suffix... rm: conftest.dSYM: is a directory<br />
.dSYM<br />
checking for Tcl configuration... configure: warning: Can't find Tcl configuration definitions</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:getbuildtest:macosx10.5&diff=19634Slicer3:getbuildtest:macosx10.52007-12-16T18:47:51Z<p>TerryLorber: </p>
<hr />
<div>MAC OS X 10.4 works great, currently getting a configure error for [incr Tcl]:<br />
<br />
<br />
running: ../incrTcl/configure --with-tcl=/Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build/lib --with-tk=/Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build/lib --prefix=/Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build<br />
loading cache ./config.cache<br />
creating ./config.status<br />
creating Makefile<br />
configuring in itcl<br />
running /bin/sh ../../incrTcl/itcl/configure --with-tcl=/Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build/lib --with-tk=/Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build/lib --prefix=/Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build --cache-file=.././config.cache --srcdir=../../incrTcl/itcl<br />
loading cache .././config.cache<br />
checking for gcc... cc<br />
checking whether the C compiler (cc ) works... yes<br />
checking whether the C compiler (cc ) is a cross-compiler... no<br />
checking whether we are using GNU C... yes<br />
checking whether cc accepts -g... yes<br />
checking for a BSD compatible install... /usr/bin/install -c<br />
checking whether make sets ${MAKE}... yes<br />
checking for ranlib... ranlib<br />
checking for Cygwin environment... no<br />
checking for object suffix... o<br />
checking for mingw32 environment... no<br />
checking for executable suffix... rm: conftest.dSYM: is a directory<br />
.dSYM<br />
checking for Tcl configuration... found /Users/tgl/workspace/Slicer3-lib/tcl-build/lib/tclConfig.sh<br />
checking for existence of /Users/tgl/workspace/Slicer3-lib/tcl-build/lib/tclConfig.sh... loading<br />
checking for Tcl private include files... Using srcdir found in tclConfig.sh: /Users/tgl/workspace/Slicer3-lib/tcl/tcl<br />
checking for building with threads... no (default)<br />
checking how to build libraries... shared<br />
checking for build with symbols... no<br />
checking for tclsh... configure: error: No tclsh found in PATH: /Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build/bin /Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build/bin /Users/tgl/workspace/Slicer3-lib/tcl-build/lib /Users/tgl/workspace/Slicer3-lib/tcl-build/lib/../bin /opt/local/bin /opt/local/sbin /usr/bin /bin /usr/sbin /sbin /usr/local/bin /usr/X11/bin<br />
configure: error: ../../incrTcl/itcl/configure failed for itcl<br />
<br />
child process exited abnormally<br />
1<br />
while executing<br />
"error $ret"<br />
(procedure "runcmd" line 23)<br />
invoked from within<br />
"runcmd ../incrTcl/configure --with-tcl=$SLICER_LIB/tcl-build/lib --with-tk=$SLICER_LIB/tcl-build/lib --prefix=$SLICER_LIB/tcl-build"<br />
invoked from within<br />
"if { ![file exists $::ITCL_TEST_FILE] || $::GENLIB(update) } {<br />
cd $SLICER_LIB/tcl <br />
<br />
runcmd $::CVS -d :pserver:anonymous:bwhspl@cvs.spl.harvard...."<br />
(file "./Scripts/genlib.tcl" line 359)<br />
<br />
child process exited abnormally <br />
1<br />
while executing <br />
"error $ret"<br />
(procedure "runcmd" line 23)<br />
invoked from within<br />
"runcmd sh ./Scripts/genlib.tcl /Users/tgl/workspace/Slicer3/../Slicer3-lib"<br />
("eval" body line 1)<br />
invoked from within<br />
"eval runcmd $cmd"<br />
(file "./Slicer3/Scripts/getbuildtest.tcl" line 294) <br />
<br />
<br />
<br />
$ ./Slicer3-lib/tcl/incrTcl/configure <br />
loading cache ./config.cache<br />
checking for prefix by checking for itclsh... (cached) /usr/bin/tclsh<br />
creating ./config.status<br />
creating Makefile<br />
configuring in itcl<br />
running /bin/sh .././Slicer3-lib/tcl/incrTcl/itcl/configure --cache-file=.././config.cache --srcdir=.././Slicer3-lib/tcl/incrTcl/itcl<br />
loading cache .././config.cache<br />
checking for gcc... cc<br />
checking whether the C compiler (cc ) works... yes<br />
checking whether the C compiler (cc ) is a cross-compiler... no<br />
checking whether we are using GNU C... yes<br />
checking whether cc accepts -g... yes<br />
checking for a BSD compatible install... /usr/bin/install -c<br />
checking whether make sets ${MAKE}... yes<br />
checking for ranlib... ranlib<br />
checking for Cygwin environment... no<br />
checking for object suffix... o<br />
checking for mingw32 environment... no<br />
checking for executable suffix... rm: conftest.dSYM: is a directory<br />
.dSYM<br />
checking for Tcl configuration... configure: warning: Can't find Tcl configuration definitions<br />
configuring in itk<br />
running /bin/sh .././Slicer3-lib/tcl/incrTcl/itk/configure --cache-file=.././config.cache --srcdir=.././Slicer3-lib/tcl/incrTcl/itk<br />
loading cache .././config.cache<br />
checking for gcc... cc<br />
checking whether the C compiler (cc ) works... yes<br />
checking whether the C compiler (cc ) is a cross-compiler... no<br />
checking whether we are using GNU C... yes<br />
checking whether cc accepts -g... yes<br />
checking for a BSD compatible install... /usr/bin/install -c<br />
checking whether make sets ${MAKE}... yes<br />
checking for ranlib... ranlib<br />
checking for Cygwin environment... no<br />
checking for object suffix... o<br />
checking for mingw32 environment... no<br />
checking for executable suffix... rm: conftest.dSYM: is a directory<br />
.dSYM<br />
checking for Tcl configuration... configure: warning: Can't find Tcl configuration definitions</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:getbuildtest:macosx10.5&diff=19633Slicer3:getbuildtest:macosx10.52007-12-16T18:46:54Z<p>TerryLorber: </p>
<hr />
<div>MAC OS X 10.4 works great, currently getting a configure error for [incr Tcl]:<br />
<br />
<br />
running: ../incrTcl/configure --with-tcl=/Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build/lib --with-tk=/Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build/lib --prefix=/Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build<br />
loading cache ./config.cache<br />
creating ./config.status<br />
creating Makefile<br />
configuring in itcl<br />
running /bin/sh ../../incrTcl/itcl/configure --with-tcl=/Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build/lib --with-tk=/Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build/lib --prefix=/Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build --cache-file=.././config.cache --srcdir=../../incrTcl/itcl<br />
loading cache .././config.cache<br />
checking for gcc... cc<br />
checking whether the C compiler (cc ) works... yes<br />
checking whether the C compiler (cc ) is a cross-compiler... no<br />
checking whether we are using GNU C... yes<br />
checking whether cc accepts -g... yes<br />
checking for a BSD compatible install... /usr/bin/install -c<br />
checking whether make sets ${MAKE}... yes<br />
checking for ranlib... ranlib<br />
checking for Cygwin environment... no<br />
checking for object suffix... o<br />
checking for mingw32 environment... no<br />
checking for executable suffix... rm: conftest.dSYM: is a directory<br />
.dSYM<br />
checking for Tcl configuration... found /Users/tgl/workspace/Slicer3-lib/tcl-build/lib/tclConfig.sh<br />
checking for existence of /Users/tgl/workspace/Slicer3-lib/tcl-build/lib/tclConfig.sh... loading<br />
checking for Tcl private include files... Using srcdir found in tclConfig.sh: /Users/tgl/workspace/Slicer3-lib/tcl/tcl<br />
checking for building with threads... no (default)<br />
checking how to build libraries... shared<br />
checking for build with symbols... no<br />
checking for tclsh... configure: error: No tclsh found in PATH: /Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build/bin /Users/tgl/workspace/Slicer3/../Slicer3-lib/tcl-build/bin /Users/tgl/workspace/Slicer3-lib/tcl-build/lib /Users/tgl/workspace/Slicer3-lib/tcl-build/lib/../bin /opt/local/bin /opt/local/sbin /usr/bin /bin /usr/sbin /sbin /usr/local/bin /usr/X11/bin<br />
configure: error: ../../incrTcl/itcl/configure failed for itcl<br />
<br />
child process exited abnormally<br />
1<br />
while executing<br />
"error $ret"<br />
(procedure "runcmd" line 23)<br />
invoked from within<br />
"runcmd ../incrTcl/configure --with-tcl=$SLICER_LIB/tcl-build/lib --with-tk=$SLICER_LIB/tcl-build/lib --prefix=$SLICER_LIB/tcl-build"<br />
invoked from within<br />
"if { ![file exists $::ITCL_TEST_FILE] || $::GENLIB(update) } {<br />
cd $SLICER_LIB/tcl <br />
<br />
runcmd $::CVS -d :pserver:anonymous:bwhspl@cvs.spl.harvard...."<br />
(file "./Scripts/genlib.tcl" line 359)<br />
<br />
child process exited abnormally<br />
1<br />
while executing <br />
"error $ret"<br />
(procedure "runcmd" line 23)<br />
invoked from within<br />
"runcmd sh ./Scripts/genlib.tcl /Users/tgl/workspace/Slicer3/../Slicer3-lib"<br />
("eval" body line 1)<br />
invoked from within<br />
"eval runcmd $cmd"<br />
(file "./Slicer3/Scripts/getbuildtest.tcl" line 294) <br />
<br />
<br />
<br />
$ ./Slicer3-lib/tcl/incrTcl/configure <br />
loading cache ./config.cache<br />
checking for prefix by checking for itclsh... (cached) /usr/bin/tclsh<br />
creating ./config.status<br />
creating Makefile<br />
configuring in itcl<br />
running /bin/sh .././Slicer3-lib/tcl/incrTcl/itcl/configure --cache-file=.././config.cache --srcdir=.././Slicer3-lib/tcl/incrTcl/itcl<br />
loading cache .././config.cache<br />
checking for gcc... cc<br />
checking whether the C compiler (cc ) works... yes<br />
checking whether the C compiler (cc ) is a cross-compiler... no<br />
checking whether we are using GNU C... yes<br />
checking whether cc accepts -g... yes<br />
checking for a BSD compatible install... /usr/bin/install -c<br />
checking whether make sets ${MAKE}... yes<br />
checking for ranlib... ranlib<br />
checking for Cygwin environment... no<br />
checking for object suffix... o<br />
checking for mingw32 environment... no<br />
checking for executable suffix... rm: conftest.dSYM: is a directory<br />
.dSYM<br />
checking for Tcl configuration... configure: warning: Can't find Tcl configuration definitions<br />
configuring in itk<br />
running /bin/sh .././Slicer3-lib/tcl/incrTcl/itk/configure --cache-file=.././config.cache --srcdir=.././Slicer3-lib/tcl/incrTcl/itk<br />
loading cache .././config.cache<br />
checking for gcc... cc<br />
checking whether the C compiler (cc ) works... yes<br />
checking whether the C compiler (cc ) is a cross-compiler... no<br />
checking whether we are using GNU C... yes<br />
checking whether cc accepts -g... yes<br />
checking for a BSD compatible install... /usr/bin/install -c<br />
checking whether make sets ${MAKE}... yes<br />
checking for ranlib... ranlib<br />
checking for Cygwin environment... no<br />
checking for object suffix... o<br />
checking for mingw32 environment... no<br />
checking for executable suffix... rm: conftest.dSYM: is a directory<br />
.dSYM<br />
checking for Tcl configuration... configure: warning: Can't find Tcl configuration definitions</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:getbuildtest:macosx10.5&diff=19632Slicer3:getbuildtest:macosx10.52007-12-16T18:42:08Z<p>TerryLorber: </p>
<hr />
<div>MAC OS X 10.4 works great, currently getting a configure error for [incr Tcl]:<br />
<br />
<br />
<br />
<br />
$ ./Slicer3-lib/tcl/incrTcl/configure <br />
loading cache ./config.cache<br />
checking for prefix by checking for itclsh... (cached) /usr/bin/tclsh<br />
creating ./config.status<br />
creating Makefile<br />
configuring in itcl<br />
running /bin/sh .././Slicer3-lib/tcl/incrTcl/itcl/configure --cache-file=.././config.cache --srcdir=.././Slicer3-lib/tcl/incrTcl/itcl<br />
loading cache .././config.cache<br />
checking for gcc... cc<br />
checking whether the C compiler (cc ) works... yes<br />
checking whether the C compiler (cc ) is a cross-compiler... no<br />
checking whether we are using GNU C... yes<br />
checking whether cc accepts -g... yes<br />
checking for a BSD compatible install... /usr/bin/install -c<br />
checking whether make sets ${MAKE}... yes<br />
checking for ranlib... ranlib<br />
checking for Cygwin environment... no<br />
checking for object suffix... o<br />
checking for mingw32 environment... no<br />
checking for executable suffix... rm: conftest.dSYM: is a directory<br />
.dSYM<br />
checking for Tcl configuration... configure: warning: Can't find Tcl configuration definitions<br />
configuring in itk<br />
running /bin/sh .././Slicer3-lib/tcl/incrTcl/itk/configure --cache-file=.././config.cache --srcdir=.././Slicer3-lib/tcl/incrTcl/itk<br />
loading cache .././config.cache<br />
checking for gcc... cc<br />
checking whether the C compiler (cc ) works... yes<br />
checking whether the C compiler (cc ) is a cross-compiler... no<br />
checking whether we are using GNU C... yes<br />
checking whether cc accepts -g... yes<br />
checking for a BSD compatible install... /usr/bin/install -c<br />
checking whether make sets ${MAKE}... yes<br />
checking for ranlib... ranlib<br />
checking for Cygwin environment... no<br />
checking for object suffix... o<br />
checking for mingw32 environment... no<br />
checking for executable suffix... rm: conftest.dSYM: is a directory<br />
.dSYM<br />
checking for Tcl configuration... configure: warning: Can't find Tcl configuration definitions</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:getbuildtest:macosx10.5&diff=19631Slicer3:getbuildtest:macosx10.52007-12-16T18:38:56Z<p>TerryLorber: New page: MAC OS X 10.4 works great, currently getting a configure error for [incr Tcl]: $ ./Slicer3-lib/tcl/incrTcl/configure loading cache ./config.cache checking for prefix by checking for i...</p>
<hr />
<div>MAC OS X 10.4 works great, currently getting a configure error for [incr Tcl]:<br />
<br />
<br />
<br />
<br />
$ ./Slicer3-lib/tcl/incrTcl/configure <br />
loading cache ./config.cache<br />
checking for prefix by checking for itclsh... (cached) /usr/bin/tclsh<br />
creating ./config.status<br />
creating Makefile<br />
configuring in itcl<br />
running /bin/sh .././Slicer3-lib/tcl/incrTcl/itcl/configure --cache-file=.././config.cache --srcdir=.././Slicer3-lib/tcl/incrTcl/itcl<br />
loading cache .././config.cache<br />
checking for gcc... cc<br />
checking whether the C compiler (cc ) works... yes<br />
checking whether the C compiler (cc ) is a cross-compiler... no<br />
checking whether we are using GNU C... yes<br />
checking whether cc accepts -g... yes<br />
checking for a BSD compatible install... /usr/bin/install -c<br />
checking whether make sets ${MAKE}... yes<br />
checking for ranlib... ranlib<br />
checking for Cygwin environment... no<br />
checking for object suffix... o<br />
checking for mingw32 environment... no<br />
checking for executable suffix... rm: conftest.dSYM: is a directory<br />
.dSYM<br />
checking for Tcl configuration... configure: warning: Can't find Tcl configuration definitions<br />
configuring in itk<br />
running /bin/sh .././Slicer3-lib/tcl/incrTcl/itk/configure --cache-file=.././config.cache --srcdir=.././Slicer3-lib/tcl/incrTcl/itk<br />
loading cache .././config.cache<br />
checking for gcc... cc<br />
checking whether the C compiler (cc ) works... yes<br />
checking whether the C compiler (cc ) is a cross-compiler... no<br />
checking whether we are using GNU C... yes<br />
checking whether cc accepts -g... yes<br />
checking for a BSD compatible install... /usr/bin/install -c<br />
checking whether make sets ${MAKE}... yes<br />
checking for ranlib... ranlib<br />
checking for Cygwin environment... no<br />
checking for object suffix... o<br />
checking for mingw32 environment... no<br />
checking for executable suffix... rm: conftest.dSYM: is a directory<br />
.dSYM<br />
checking for Tcl configuration... configure: warning: Can't find Tcl configuration definitions</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:getbuildtest&diff=19630Slicer3:getbuildtest2007-12-16T18:36:33Z<p>TerryLorber: /* getbuildtest.tcl */</p>
<hr />
<div>== Background ==<br />
<br />
The getbuildtest script was created to simplify the process of setting up a build on a new system. It ''get''s the needed code from repositories, ''build''s the code with a compatible set of configuration options, and ''test''s the resulting binaries and submits them to the dashboard as an experimental build.<br />
<br />
== getbuildtest.tcl ==<br />
<br />
Three files are used as part of this process:<br />
* slicer_variables.tcl contains global settings for the build process including what versions of support libraries to checkout.<br />
* Scripts/genlib.tcl builds all the support libraries (puts them in Slicer3-lib)<br />
* Scripts/getbuildtest.tcl calls genlib and once it completes successfully it builds slicer3 in Slicer3-build<br />
<br />
MAC OS X 10.5 issues [[Slicer3:getbuildtest:macosx10.5]]<br />
<br />
== getbuildtest2.tcl ==<br />
<br />
The getbuildtest2 script an experimental version that should/will someday replace getbuildtest.<br />
<br />
The main differences are:<br />
* libraries are pulled from [[Slicer3-lib-mirror]]<br />
* extra libraries like python and BatchMake are being added<br />
<br />
As of September 2007, python is not building correctly with all the desired libraries so work on getbuildtest2 is still ongoing.<br />
<br />
Most developers should be using getbuiltest for now.</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:Loadable_Modules:Phase1&diff=19616Slicer3:Loadable Modules:Phase12007-12-15T16:55:40Z<p>TerryLorber: </p>
<hr />
<div>From [[Slicer3:Loadable_Modules]]:<br />
* runtime module discovery<br />
* module template<br />
* like CommandLineModuleFactory <br />
<br />
----<br />
<br />
<br />
Starting at ~900 in Applications/GUI/Slicer3.cxx, static modules load occurs.<br />
<br />
Using vtkSys tools to list shared libraries present. Use itk::DyanmicLoader to open libraries and call our specified entry points.<br />
<br />
The actions taken for each module to be added could be queried from the found shared library using a LoadableModuleInfo class. Some of the information a library should provide:<br />
<br />
* vtkSlicerLogic pointer (maybe this is one of the defined entry points for a loadable module)<br />
* methods to call on the Logic pointer<br />
* vtkSlicerModulesGUI pointer (ditto)<br />
* methods to call on the GUI pointer<br />
* module name<br />
<br />
LoadableModuleFactory (dervie from? Libs/ModuleDescriptionParser/ModuleFactory.cxx) handles this. Looks like ModuleFactory::ScanForSharedObjectModules does something very similar.<br />
<br />
<br />
Create shared libraries for each of the static modules listed in Slicer3.cxx</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:Loadable_Modules:Phase1&diff=19615Slicer3:Loadable Modules:Phase12007-12-15T16:26:15Z<p>TerryLorber: </p>
<hr />
<div>From [[Slicer3:Loadable_Modules]]:<br />
* runtime module discovery<br />
* module template<br />
* like CommandLineModuleFactory <br />
<br />
----<br />
<br />
<br />
Starting at ~900 in Applications/GUI/Slicer3.cxx, static modules load occurs.<br />
<br />
Using vtkSys tools to list shared libraries present. Use itk::DyanmicLoader to open libraries and call our specified entry points.<br />
<br />
The actions taken for each module to be added could be queried from the found shared library using a LoadableModuleInfo class. Some of the information a library should provide:<br />
<br />
* vtkSlicerLogic pointer (maybe this is one of the defined entry points for a loadable module)<br />
* methods to call on the Logic pointer<br />
* vtkSlicerModulesGUI pointer (ditto)<br />
* methods to call on the GUI pointer<br />
* module name<br />
<br />
LoadableModuleFactory (dervie from? Libs/ModuleDescriptionParser/ModuleFactory.cxx) handles this. Looks like ModuleFactory::ScanForSharedObjectModules does something very similar.</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:Loadable_Modules:Phase1&diff=19614Slicer3:Loadable Modules:Phase12007-12-15T16:25:49Z<p>TerryLorber: </p>
<hr />
<div>From [[Slicer3:Loadable_Modules]]:<br />
* runtime module discovery<br />
* module template<br />
* like CommandLineModuleFactory <br />
<br />
----<br />
<br />
<br />
Starting at ~900 in Applications/GUI/Slicer3.cxx, static modules load occurs.<br />
<br />
Using vtkSys tools to list shared libraries present. Use itk::DyanmicLoader to open libraries and call our specified entry points.<br />
<br />
The actions taken for each module to be added could be queried from the found shared library using a LoadableModuleInfo class. Some of the information a library should provide:<br />
<br />
* vtkSlicerLogic pointer (maybe this is one of the defined entry points for a loadable module)<br />
* methods to call on the Logic pointer<br />
* vtkSlicerModulesGUI pointer (ditto)<br />
* methods to call on the GUI pointer<br />
* module name<br />
<br />
LoadableModuleFactory (ala Libs/ModuleDescriptionParser/ModuleFactory.cxx) handles this. Looks like ModuleFactory::ScanForSharedObjectModules does something very similar.</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:Loadable_Modules:Phase1&diff=19613Slicer3:Loadable Modules:Phase12007-12-15T16:12:27Z<p>TerryLorber: </p>
<hr />
<div>From [[Slicer3:Loadable_Modules]]:<br />
* runtime module discovery<br />
* module template<br />
* like CommandLineModuleFactory <br />
<br />
----<br />
<br />
<br />
Starting at ~900 in Applications/GUI/Slicer3.cxx, static modules load occurs.<br />
<br />
Using vtkSys tools to list shared libraries present. Use itk::DyanmicLoader to open libraries and call our specified entry points.<br />
<br />
The actions taken for each module to be added could be queried from the found shared library using a LoadableModuleInfo class. Some of the information a library should provide:<br />
<br />
* vtkSlicerLogic pointer (maybe this is one of the defined entry points for a loadable module)<br />
* methods to call on the Logic pointer<br />
* vtkSlicerModulesGUI pointer (ditto)<br />
* methods to call on the GUI pointer<br />
* module name<br />
<br />
LoadableModuleFactory (ala Libs/ModuleDescriptionParser/ModuleFactory.cxx) handles this.<br />
<br />
----<br />
<br />
?? Looks like ModuleFactory::ScanForSharedObnjectModules does something very similar.</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:Loadable_Modules:Phase1&diff=19612Slicer3:Loadable Modules:Phase12007-12-15T16:10:48Z<p>TerryLorber: </p>
<hr />
<div>From [[Slicer3:Loadable_Modules]]:<br />
* runtime module discovery<br />
* module template<br />
* like CommandLineModuleFactory <br />
<br />
----<br />
<br />
<br />
Starting at ~900 in Applications/GUI/Slicer3.cxx, static modules load occurs.<br />
<br />
Using vtkSys tools to list shared libraries present. Use itk::DyanmicLoader to open libraries and call our specified entry points.<br />
<br />
The actions taken for each module to be added could be queried from the found shared library using a LoadableModuleInfo class. Some of the information a library should provide:<br />
<br />
* vtkSlicerLogic pointer (maybe this is one of the defined entry points for a loadable module)<br />
* methods to call on the Logic pointer<br />
* vtkSlicerModulesGUI pointer (ditto)<br />
* methods to call on the GUI pointer<br />
* module name<br />
<br />
LoadableModuleFactory (ala Libs/ModuleDescriptionParser/ModuleFactory.cxx) handles this.</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:Loadable_Modules:Phase1&diff=19611Slicer3:Loadable Modules:Phase12007-12-15T16:06:59Z<p>TerryLorber: </p>
<hr />
<div>From [[Slicer3:Loadable_Modules]]:<br />
* runtime module discovery<br />
* module template<br />
* like CommandLineModuleFactory <br />
<br />
----<br />
<br />
<br />
Starting at ~900 in Applications/GUI/Slicer3.cxx, static modules load occurs.<br />
<br />
Using vtkSys tools to list shared libraries present. ??? Call entry point on library ??? using system tools.<br />
<br />
The actions taken for each module to be added could be queried from the found shared library using a LoadableModuleInfo class. Some of the information a library should provide:<br />
<br />
* vtkSlicerLogic pointer (maybe this is one of the defined entry points for a loadable module)<br />
* methods to call on the Logic pointer<br />
* vtkSlicerModulesGUI pointer (ditto)<br />
* methods to call on the GUI pointer<br />
* module name<br />
<br />
LoadableModuleFactory (ala Libs/ModuleDescriptionParser/ModuleFactory.cxx)</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:Loadable_Modules:Phase1&diff=19610Slicer3:Loadable Modules:Phase12007-12-15T15:06:40Z<p>TerryLorber: New page: From Slicer3:Loadable_Modules: * runtime module discovery * module template * like CommandLineModuleFactory ---- Starting at ~900 in Applications/GUI/Slicer3.cxx, stati...</p>
<hr />
<div>From [[Slicer3:Loadable_Modules]]:<br />
* runtime module discovery<br />
* module template<br />
* like CommandLineModuleFactory <br />
<br />
----<br />
<br />
<br />
Starting at ~900 in Applications/GUI/Slicer3.cxx, static modules load occurs.</div>TerryLorberhttps://www.na-mic.org/w/index.php?title=Slicer3:Loadable_Modules&diff=19609Slicer3:Loadable Modules2007-12-15T15:04:43Z<p>TerryLorber: </p>
<hr />
<div>* User experience<br />
** Run slicer<br />
** File->Get Modules<br />
*** Web browser http://modules.slicer.org/<version #><br />
*** Archived of precompiled shared libraries (platform specific)<br />
** Select modules<br />
** Modules are downloaded and unpacked into Slicer build tree (install directory)<br />
** Restart Slicer<br />
** Can remove modules<br />
<br />
* Developer<br />
** make slicer build tree locally<br />
** create module from a template (GUI, Logic, MRML) see GAD<br />
** test locally on their platform<br />
** create project in NITRC (source forge)<br />
** submit module to a “build farm”<br />
*** Register svn with slicer.org (Kittware, TBD)<br />
** Nightly build gets uploaded to slicer.org <br />
<br />
* Phase 1: Slicer internals [[Slicer3:Loadable_Modules:Phase1]]<br />
** runtime module discovery<br />
** module template<br />
** like CommandLineModuleFactory<br />
<br />
* Phase 2: web development, deployment<br />
** prototype on wiki<br />
** versions, download,<br />
** upload</div>TerryLorber