diff --git a/Documentation/Cookbook/Scripts/otbGenerateWrappersRstDoc.py b/Documentation/Cookbook/Scripts/otbGenerateWrappersRstDoc.py index f9c22a7397be3bba3e0f06f32cbff39fd4daa1ed..4ff87275380103a80c6ad7e929d0c50bb487f333 100755 --- a/Documentation/Cookbook/Scripts/otbGenerateWrappersRstDoc.py +++ b/Documentation/Cookbook/Scripts/otbGenerateWrappersRstDoc.py @@ -29,8 +29,6 @@ from otbApplication import ParameterType_Bool, ParameterType_Int, ParameterType_ from otb_warnings import application_documentation_warnings linesep = os.linesep -pixeltypes = {' uchar' : 1, ' int8' : 0, ' uint8' : 1, ' int16' : 2, ' uint16': 3, ' int32' : 4, ' uint32' : 5, ' float' : 6, ' double': 7} - def EncloseString(s): if not s.startswith("\"") : @@ -54,6 +52,7 @@ def ExpandPath(filename,path,exp): return os.path.join(path,filename) def GetPixelType(value): + pixeltypes = {' uchar' : 1, ' int8' : 0, ' uint8' : 1, ' int16' : 2, ' uint16': 3, ' int32' : 4, ' uint32' : 5, ' float' : 6, ' double': 7} # look for type foundcode = -1 foundname = "" @@ -64,38 +63,16 @@ def GetPixelType(value): break return foundcode,foundname -def render_choice(app, key): - "Render a choice parameter to rst" - - # First render all the choice values - choice_keys = app.GetChoiceKeys(key) - choice_names = app.GetChoiceNames(key) - - choice_entries = "" - for (choice_key, choice_name) in zip(choice_keys, choice_names): - # For the description, replace newlines by |br| because we are in a bullet list item - choice_description = app.GetParameterDescription(key + "." + choice_key).replace("\n", " |br| ") - choice_entries += template_parameter_choice_entry.format( - name=choice_name, - #key=choice_key, # if we want to show the key in choice parameter values - description=choice_description - ) - - # Then render the full choice parameter - return template_parameter_choice.format( - name=app.GetParameterName(key), - key=key, - value="[" + "|".join(choice_keys) + "]", - flags=rst_parameter_flags(app, key), - description=app.GetParameterDescription(key), - choices=choice_entries, - ) - def GetApplicationExamplePythonSnippet(app,idx,expand = False, inputpath="",outputpath=""): appname = "app" - output = "" + # Render example comment + if len(app.GetExampleComment(idx)) > 0: + output += app.GetExampleComment(idx) + ":\n\n" + + output += ".. code-block:: python\n\n" + output+= "\timport otbApplication" + linesep + linesep output+= "\t" + appname + " = otbApplication.Registry.CreateApplication(\"" + app.GetName() + "\")" + linesep + linesep for i in range(0, app.GetExampleNumberOfParameters(idx)): @@ -172,9 +149,36 @@ def GetApplicationExamplePythonSnippet(app,idx,expand = False, inputpath="",outp output += "\t" + appname + ".SetParameterStringList("+EncloseString(param)+ ", " + str(values) + ")" output+=linesep output += linesep - output+= "\t" + appname + ".ExecuteAndWriteOutput()"+ linesep + output+= "\t" + appname + ".ExecuteAndWriteOutput()" + linesep + linesep return output +def render_choice(app, key): + "Render a choice parameter to rst" + + # First render all the choice values + choice_keys = app.GetChoiceKeys(key) + choice_names = app.GetChoiceNames(key) + + choice_entries = "" + for (choice_key, choice_name) in zip(choice_keys, choice_names): + # For the description, replace newlines by |br| because we are in a bullet list item + choice_description = app.GetParameterDescription(key + "." + choice_key).replace("\n", " |br| ") + choice_entries += template_parameter_choice_entry.format( + name=choice_name, + #key=choice_key, # if we want to show the key in choice parameter values + description=choice_description + ) + + # Then render the full choice parameter + return template_parameter_choice.format( + name=app.GetParameterName(key), + key=key, + value="[" + "|".join(choice_keys) + "]", + flags=rst_parameter_flags(app, key), + description=app.GetParameterDescription(key), + choices=choice_entries, + ) + def rst_section(text, delimiter, ref=None): "Make a rst section title" @@ -235,22 +239,22 @@ def detect_abuse(app): fake_groups = {} keys = app.GetParametersKeys() + choice_keys = [k for k in keys if app.GetParameterType(k) == ParameterType_Choice] # For each choice parameter - for key in keys: - if app.GetParameterType(key) == ParameterType_Choice: + for key in choice_keys: - # Consider all its possible values - for choice_key in app.GetChoiceKeys(key): - fullkey = key + "." + choice_key + # Consider all its possible values + for choice_key in app.GetChoiceKeys(key): + fullkey = key + "." + choice_key - # See if that value is also used as a group anywhere in the application - for k in keys: - if k.startswith(fullkey) and k != fullkey: + # See if that value is also used as a group anywhere in the application + for k in keys: + if k.startswith(fullkey) and k != fullkey: - # In that case, mark the first element of that group - if fullkey not in fake_groups.values(): - fake_groups[k] = fullkey + # In that case, mark the first element of that group + if fullkey not in fake_groups.values(): + fake_groups[k] = fullkey return fake_groups diff --git a/Documentation/Cookbook/Scripts/otb_warnings.py b/Documentation/Cookbook/Scripts/otb_warnings.py index 4ed62aee4ac43211bf914aaed7fc45d3e72e19a1..5391cf5cf88633bd4c61c4d7446e35097435af3f 100644 --- a/Documentation/Cookbook/Scripts/otb_warnings.py +++ b/Documentation/Cookbook/Scripts/otb_warnings.py @@ -20,8 +20,8 @@ def parameter_warnings(app_warn, app, key): #if description == "": #warn("missing description") - #if len(description) > 0 and description[-1] != ".": - #warn("description does not end with a period") + if len(description) > 0 and description[-1] != ".": + warn("description does not end with a period") if len(description) > 0 and " :" in description: warn("description has a space before a colon") diff --git a/Documentation/Cookbook/rst/templates/application.rst b/Documentation/Cookbook/rst/templates/application.rst index e5d1081d054db1454dcb957b2c6a8e1ca03cae34..a05c9699e3aef827d6b575837f4e75a0ec9d07e9 100644 --- a/Documentation/Cookbook/rst/templates/application.rst +++ b/Documentation/Cookbook/rst/templates/application.rst @@ -32,8 +32,6 @@ From the command-line: From Python: -.. code-block:: python - {examples_python} {limitations} diff --git a/Modules/Applications/AppSegmentation/app/otbSegmentation.cxx b/Modules/Applications/AppSegmentation/app/otbSegmentation.cxx index 0103fee6b29d5602b478ff2d448231d09c2bd048..ba14bc854e30d26b119ceabd3f393203ceb0c4c7 100644 --- a/Modules/Applications/AppSegmentation/app/otbSegmentation.cxx +++ b/Modules/Applications/AppSegmentation/app/otbSegmentation.cxx @@ -144,18 +144,24 @@ private: // Documentation SetDocName("Segmentation"); - SetDocLongDescription("This application allows one to perform various segmentation algorithms on a multispectral image." - "Available segmentation algorithms are two different versions of Mean-Shift segmentation algorithm (one being multi-threaded)," - " simple pixel based connected components according to a user-defined criterion, and watershed from the gradient of the intensity" - " (norm of spectral bands vector). The application has two different modes that affects the nature of its output.\n\nIn raster mode," - " the output of the application is a classical image of unique labels identifying the segmented regions. The labeled output can be passed to the" - " ColorMapping application to render regions with contrasted colours. Please note that this mode loads the whole input image into memory, and as such" - " can not handle large images. \n\n To segment large data, one can use the vector mode. In this case, the output of the application is a" - " vector file or database. The input image is split into tiles (whose size can be set using the tilesize parameter), and each tile is loaded, segmented" - " with the chosen algorithm, vectorized, and written into the output file or database. This piece-wise behavior ensure that memory will never get overloaded," - " and that images of any size can be processed. There are few more options in the vector mode. The simplify option allows simplifying the geometry" - " (i.e. remove nodes in polygons) according to a user-defined tolerance. The stitch option tries to stitch together the polygons corresponding" - " to segmented region that may have been split by the tiling scheme. "); + SetDocLongDescription( + "This application allows one to perform various segmentation algorithms on a multispectral image." + " Available segmentation algorithms are two different versions of Mean-Shift segmentation algorithm (one being multi-threaded)," + " simple pixel based connected components according to a user-defined criterion, and watershed from the gradient of the intensity" + " (norm of spectral bands vector). The application has two different modes that affects the nature of its output.\n\n" + + "In raster mode, the output of the application is a classical image of unique labels identifying the segmented regions. The labeled output can be " + "passed to the" + " ColorMapping application to render regions with contrasted colours. Please note that this mode loads the whole input image into memory, and as such" + " can not handle large images.\n\n" + + "To segment large data, one can use the vector mode. In this case, the output of the application is a" + " vector file or database. The input image is split into tiles (whose size can be set using the tilesize parameter), and each tile is loaded, segmented" + " with the chosen algorithm, vectorized, and written into the output file or database. This piece-wise behavior ensure that memory will never get" + " overloaded, and that images of any size can be processed. There are few more options in the vector mode. The simplify option allows simplifying the " + "geometry" + " (i.e. remove nodes in polygons) according to a user-defined tolerance. The stitch option tries to stitch together the polygons corresponding" + " to segmented region that may have been split by the tiling scheme. "); SetDocLimitations("In raster mode, the application can not handle large input images. Stitching step of vector mode might become slow with very large input images." " \nMeanShift filter results depends on the number of threads used. \nWatershed and multiscale geodesic morphology segmentation will be performed on the amplitude "