Version 4.40 Changes
A few bug fixes and somewhat major changes regarding the logic used when working with DTM files with gaps between adjacent tiles and surface models with different resolutions.
Logic changes related to grid alignment when coordinates have negative values that only affect operations where X or Y values are negative.

***All users should update their version of FUSION.

Version 4.30 Changes
Version 4.30 includes a major bug fix for the GridMetrics program. Several of the intensity metrics were being computed incorrectly when 
the /strata option was used. Namely the L-moment and percentile metrics. All intensity metrics were correct when the /strata option was 
not used on the command line. It also includes a minor fix to the LDV viewer that may affect some users.

************************************************************************************
5/19/2022  FUSION 4.40 release   ***************************************************
************************************************************************************
5/17/2022 Several programs: GridMetrics, TreeSeg, CanopyModel, Catalog, ClipData, Cover, FilterData, FirstLastReturn, GridSurfaceCreate, GroundFilter,
IntensityImage, MergeData, PolyClipData, ReturnDensity, TINSurfaceCreate, ThinData
Added logic that checks for valid point file formats and eliminates non-point files prior to the start of processing. This logic is designed to overcome problems
with Windows and wildcard processing. For example, *.las will match files with the .las extension but also match files with the .lasx extension. This new logic
can be turned off using the /skipfilecheck option.

This logic will eventually be added to all command line programs that read point data.

4/18/2022 FUSION V4.40...no version change
Experimental modifications to allow tree DBH and lean information for tree files/models. Modifications only take effect when tree files have additional
columns after the RGB color information. Additional columns are DBH (same units as point data), lean angle from vertical, and lean azimuth. As part of these
modifications, I changed the logic used to select the color for the trees to use the color in the tree file when included or the object color from the properties
for the set of trees when color is not included for individual trees.

Added option to preferences to control how tree objects are clipped for sample to display. Previous versions used the extent of the tree crown (bounding box)
to select trees for inclusion in the sample. The new option in File...Preferences allows using only the tree location. Also corrected the original logic to
use the crown radius as originally intended. The old logic was using the crown diameter so it was including more trees than intended.

Working on logic to allow adjustment of individual trees for position and orientation (lean). This includes some new options in preferences and a new dialog
to provide an interface to the new capabilites. All of these changes are considered experimental in version 4.40 but will stabilize soon.

4/14/2022 LDV V1.67
After 16 years of having the default axis color in LDV set to match the background color, I finally changed the default to light gray
so you can actually see the axes!! The colors are saved in the registry but for a new install, the default when there were no registry
entries for LDV was set to black. For existing installations, you will need to change the axis color to update the value in the registry.
In the LDV window, right click your mouse, then select Colors... Then click the "Screen" button to set colors to the correct default values.
The changes will be automatically updated in the registry.

3/29/2022 TreeSeg V1.91
Added a check when writing points to files to make sure the point was within one of the basins. I think most of the cases where TreeSeg has been used 
to extract point clouds for trees involve workflows from AreaProcessor. In these cases, the point clip matches the area of the CHM so all points will be within
a "basin" or within the CHM area. For cases where point data includes areas outside the CHM, TreeSeg was crashing for some cases. The new
check should prevent this.

3/14/2022 GridMetrics V3.71 also affects many other programs
Fixed logic that computes the extent of the point data to correctly expand the grid for metrics when X or Y values are negative. This happens in some projections such
as web Mercator where X values for North America are negative. Previous code did not correctly align the output grid for metrics to be a multiple of the cell size. This
error does not affect areas where both the X and Y values for coordinates are positive.

Version numbers were not modified for most programs for this change.

3/7/2022 AreaProcessor V1.89
Added logic to check for potential cases where the length of output file names (including the path) exceed 260 chacters. This is the limit for the functions used by most of the FUSION 
programs. When the full paths exceed 260 characters, things fail such that some output files (shorter file specifiers) are produced and others are not (longer file specifiers). The 
new logic assumes that users are using the standard distribution scripts for processing. If someone is using their own scripts to drive the processing, they can still produce a 
processing layout and generate batch files. If you choose to do this, make sure the logic in your batch files does not produce files specifiers longer than 260 characters.

3/3/2022 Several programs
Modified the logic used to interpolate elevation values when there are gaps between adjacent tiles (acquisitions that use USGS specifications). Previous logic was not interpolating a
value if you had a coarse-resolution surface model included (this is done so topopgraphic metrics computed using a large neighborhood have useable values near the acquisition
boundary) in the set of surface models. The new logic attempts to interpolate a value from the surface models with the finest resolution before using the coarser resolution
models. This problem only occurred when using models with different resolutions. In addition, the problem only occurred when an in-memory model was created to support the processing
so not all FUSION programs were affected. If the coarse-resolution surface has values close to those of the fine-resolution surface, the flawed logic does not produce bad outputs.
However, if the coarse-resolution surface is significnatly above or velow the fine-resolution surface, some edge artifacts are evident in some outputs.

2/28/2022 FUSION V4.40
In addition to the changes mentioned above regarding the elevation interpolation logic:

Modified logic used when determining the tree models to include in the visualization data set. Old logic added too many trees. New logic looks at
the tree's crown radius and only includes tree objects/models that overlap the sample area.

2/23/2022 IntensityImage V1.40
Changed the code that maps world coordinates in CGeoreferencedImage class to correct some misalignments that showed up when merging the intermediate
images. The final image was shifted to the north 1-2 cells relative the point data. Intermediate images were aligned with the point data.

2/17/2022 TreeSeg V1.90
Added /class option to include or exclude points based on their classification code when clipping points for segments.

Also modified the logic used to smooth crown perimeters so it can't expand the perimeters...it can only shink them. I was seeing
several cases where perimeters were expanding to include portions of adjacent trees. The flaw was especially troublesome when clipping
points for the tree objects and then trying to characterize the objects. The points from adjacent crowns, especially the additional points
due to the flawed behavior of the smoothing logic, caused problems.

************************************************************************************
1/7/2022  FUSION 4.30 release   ****************************************************
************************************************************************************
1/3/2022 Gridmetrics V3.70
Fixed a major problem with the intensity metrics when the /strata option was used. Some of these metrics were computed incorrectly in previous versions when using the 
/strata option. The problem was obvious when evaulating values for the metrics. For the L-moment metrics, L1 was correct but L2, L3, and L4 could
sometimes have negative values (not possible). Lcv, Lskew, and Lkurt were also incorrect. Percentile metrics for intensity would not be correct and values did not 
increase going from P01 to P99 as they should. This problem only affected intensity metrics and only occurred when the /strata option was used.

12/7/2021 LDV V1.65
Fixed a problem with the scaling of coordinates when the minimum Z value in the point data is exactly 0.0. This was causing a problem
with the scaling such that points were not being displayed.

************************************************************************************
6/15/2021  FUSION 4.21 release   ***************************************************
************************************************************************************
6/15/2021 Installer
Modifed the installer to default to Program Files/FUSION folder to facilitate an automated install process used by Forest Service CIO

5/12/2021 ReturnDensity V1.30
Fixed a problem with multiple input data files provided on the command line. Previous versions were only recognizing and 
using the first file.

4/22/2021 CanopyMaxima V1.54
Added a 64-bit build to the project. I'm not sure why this program didn't have a 64-bit build target but it may have simply been an oversite as I worked to 
get all the other programs into 64-bit world.

3/3/2021 FUSION V4.21
Fixed a memory leak related to loading hotspots. Memory for the hotspots was not being properly cleaned up when FUSION closed. This problem should not
have caused any problems for users.

Also fixed problems opening a .dvz project file from Explorer or a command prompt. Previous versions were not responding to the request to open the project. 
From the user perspective, if they double-clicked on a .dvz file, nothing happened. Also cleaned up some of the drawing behavior when a .dvz file is opened. 
If the display took longer than a second to draw and the project was last saved in full-screen mode, the redraw after jumping to full-screen mode didn't 
occur so the user had to press F5 to force a redraw. The potential adverse effect of this fix is that the project may redraw twice when first loaded.

2/26/2021 PolyClipData V1.73
Fixed a bug working with old .lda format files. Clips were not working as a result of the fix on 10/5/2020. In addition, this same fix (10/5/2020) did not
correctly handle files when working without the laszip.dll. Clips would work but, in some cases, they would take much longer than necessary. I also, fixed a 
problem when there were no points within a polygon within a set of polygons and when using the /multifile option. This was a problem introduced with the
10/5/2020 changes but may not have shown any outward errors for people.

Also fixed a problem with shapefiles containing more than 509 features. Previous versions were failing after feature 508 due to an issue related to not properly
cleaning up memory associated with files opened with the LASzip dll. Clipping was working correctly when not using the dll. As part of this fix, I bumped the 
number of features processed in a single pass through the point data from 64 to 496. This should speed up processing for files with lots of features. The upper 
limit on the number of features is tied to the number of files that can be open at one time. As of 2/26/2021, the limit is 512 for programs that use the
standard C libraries. While this limit can be increased, the limit cannot be increased in the LASzip dll without rebuilding the dll. I set the maximum number
of features processed in each pass through the data to the maximum number of files minus 16 to allow for open input data files and other system files.

I added a warning message when you try to clip points using overlapping polygons. PolyClipData does not do this correctly (yet) so the output for the first
polygon containing a point will contain the point but subsequent polygons containing the point won't. This is only an issue when /multifile is used.

************************************************************************************
1/21/2021  FUSION 4.20 release   ***************************************************
************************************************************************************

1/20/2021 XYZ2DTM v1.40
Fixed a bug that should have been causing failures for all runs. I suspect the bug is related to better variable initialization from the previous modification
or the move to a newer version of Visual Studio. The cell size was being incorrectly determined so everything should have crashed.

1/20/2021 All programs that output LAS files
Fixed a problem when you have several input files and they are different versions/formats of LAS. The old logic used most header values for the first input file
but updated the format and offset to data fields. This was failing if a file with a larger header was first in the list of inputs followed by files with a smaller
header. The version/format was being set but the header size and offset to data was not being changed to match the version/format. I changed to logic to only use
header values from the first input file and ignore all header fields for other input files. I think this fix will work in all cases but there may be some undesirable
behavior/side-effects when you have various versions/formats of LAS data. If you happen to provide a set of inputs where the first file is a "new" version, you will 
get an output that is also a "new" version. However, if you give the same set of files but an "old" version file is first in the list, you will get "old" an version
output file. This behavior could affect subsequent use of the data that expects a specific version/format.

1/14/2021 GridMetrics V3.65
Added the failnoz option to check ground surface files prior to computing metrics and fail if there are any problems. Without the option, metrics are computed using
point elevations (instead of heights) in areas with bad or missing ground surface data.

10/2/2020 GridMetrics & CloudMetrics
I noticed that the version header file for FUSION was not correct when these 2 programs were built for FUSION 4.10 so they indicate that they
are part of FUSION 4.00. This causes no problems but could confuse people trying to figure out if they are using the most recent versions of
these programs. I chose not to update the FUSION version and push a new distribution.

************************************************************************************
9/30/2020  FUSION 4.10 release   ***************************************************
************************************************************************************

9/22/2020 All programs that use multiple ground models
Made some changes to help with interpolation when using several surface files and added the m_ModelUsedForInternalModel flags to
shorten the list when models are preloaded to cover a specific extent. Prior logic worked but when it encountered a situation where there was
a gap in coverage or a shift to a low resolution ground model (compared to the highest reolution model in the set of models in use), it would
start evaluating all models in the list provided when the TerrainSet was created. This list could include many more models that didn't 
cover the extent needed so there was a bunch of time being wasted unnecessarily checking models leading to a 10X run time or longer in some cases.

9/22/2020 ReturnDensity V1.29
The logic when using the /grid, /gridxy, /extent, and /align options is flawed. The origin and extent are set correctly but
the test for points to count uses the origin and extent to test the location of the points instead of the outer corners of
the cells. When running with all data for an area, this doesn't affect the result because there is no data in a cell that
isn't being counted. However, when running a specific area within a block of data, the edge cells only count half the points.
Even worse is when you are working with tiles within a larger area because you get edges that overlap and, while the values in
the overlapping cells sum to the correct total for the cell, you have to pick one or the other when mosaicing (at least when 
working with AP scripts) so you get obvious edge problems. I fixed this by expanding the extent used to test point files and 
points to cover the entire area covered by the raster cells.

9/15/2020 PolyClipData V1.70
Additional work to fix problems related to extra bytes in header in files with no VLRs. 4/1/2019 fix worked when there were VLRs in the file. I missed a case
when making the 4/1/2019 changes. Symptoms were that you would see the message "Creating output files for polygons 1 - 1 of 1..." and then PolyClipData
would silently crash. The output files would have problems in the header and the point data so they were totally invalid. This was the last program I changed
with the 4/1/2019 changes and I just missed the case where there were no VLRs in the first input file. I tested this version with and without laszip.dll and for files
with and without VLRs and extra bytes after the header and in the header.

9/10/2020 TreeSeg V1.83
Fixed a problem related to clipping point data to match the polygon segments. TreeSeg was crashing when all points for a tree were contained within
another segment (no non-overlapping points for the polygon). TreeSeg would die with no messages and no point clips for segments. Problem was related
to how the duplicate points were being handled and using attributes of non-duplicated points to set the filename for the point clip.

************************************************************************************
6/17/2020  FUSION 4.00 release   ***************************************************
************************************************************************************

5/19/2020 All programs that read point data
Fixed an error with the LastPointIsWithheld(), LastPointIsSynthetic(), and LastPointIsKeypoint() functions when using the LASzip.dll.
For point record formats 0-5, code was using the classification field as if it contained 8 bits...it doesn't. Previous versions work
correctly. Only beta release versions since January 28, 2019 were affected and there was only a problem with data that has points
marked as synthetic, overlap, or withheld.

5/7/2020 ASCII2DTM V1.32
Added logic to report an error when converting file to DTM format. Previous code failed if the
input or output files couldn't be opened but did not return an error.

5/1/2020 GridMetrics V3.64 CloudMetrics V2.74
Added code to prevent problems with the calculation of profile area when points have negative heights or the 99th percentile is negative. Changes should
prevent large negative and positive values for profile area. These changes may result in slightly different values for profile area
than previous versions. If you are using profile area for comparisons between different data sets, you should rerun the metrics for all data involved in the
comparison.

4/22/2020 CloudMetrics V2.73
Made a change to the logic for the /pa option so percentile output is appended to an existing file. Previous versions were creating a new file without headers (column labels)
when the /new option was not used.

3/16/2020 PDQ V2.54
Minor revision to change message when skipping cells when drawing surfaces so no message is displayed when all cells are drawn (full resolution used for drawing).
Previous versions would display "Skipping every 1 cells"...I thought this was misleading. 

3/16/2020 most programs that use DTMs to normalize point heights or surface heights
Added the InterpolateInGap() function to deal with gaps between models. This is to specifically address problems with 3DEP DEMs where
the coverage is based on a raster interpretation rather than a lattice interpretation. The logic uses the cell size of the highest-resolution model
as the search distance. This should be OK for the 3DEP DEMs but this could be changed to "fill" larger gaps. For 3DEP DEMs, the gap is 1
cell so the search distance could be dropped to the (cell size / 2). However, this would be interpolating values on the edge of the DTM and there
could be some odd behavior at the edges (potential edge mismatch).

*****This change eliminates the need to use the RepairGridDTM tool when using data from the USGS 3DEP program prior to using DTMs in AreaProcessor.
It may also eliminate the need for RepairGridDTM when using data from other sources. In general, the RepairGridDTM tool was needed whenever DEM
data were delivered in ESRI GRID format that did not include overlap between adjacent tiles. In reality, no overlap between raster tiles means
there is a gap in coverage between the tiles unless tiles are mosaiced prior to use.

3/13/2020 CanopyModel V1.98
Modified the verbose output to report the ground models that are being accessed from disk (not loaded into memory). I have been seeing large processing
runs where CHMs for most tiles process relatively fast but a few take much longer (50-100 times longer). I suspect there are case where one or more ground models
are being used from disk. Early testing showed that this could lead to the excessively long run times for CanopyModel.

3/9/2020 CloudMetrics V2.72
Changed code to move arrays used to compute strata metrics into heap memory and out of the stack. There was too much memory being allocated on the stack. I wasn't seeing
any problems due to this but decided to change things to prevent the possibility of problems.

3/3/2020 MergeDTM V1.54 and other programs
Made changes to work when output files exceed 2Gb in size. Previous versions would appear to function with large files but data in the file was incorrect
with values beyond the 2Gb limit written starting at the beginning of the file. The fix involves using a seek function that works with offsets that are
64-bit integers instead of 32-bit integers.

2/26/2020 AreaProcessor V1.88
Added a warning when getting ready to compute the tile layout if the cell size is not one of the "standard" sizes (30m or 98.424ft), you are using the metric cell size but have units 
set to feet, or you are using the imperial cell size but have units set to meters. This will add an extra verification step when computing the tile layout for those changing the cell 
size but feedback I receive indicates that most users are using the "standard" cell sizes.

2/26/2020 TreeSeg V1.82
Turned off the option to normalize using the high point elevation. Not sure why this was turned on but I'm guessing I was testing something and forgot
to reset the switch. Some beta testers received the version with the option turned on so I bumped the version number just to be able to track the change.

2/25/2020 CloudMetrics V2.71
Changed the logic used to compute the mode elevation and intensity values for strata. This is the same changed done in V2.61 to detect and prevent a divide-by-zero
error but I missed it for the strata calculations. The real problem was that the min/max values for the strata can be the same so their difference is zero. This
can happen if there is only 1 point in the strata or if the min/max just happen to be the same.

2/25/2020 GridMetrics V3.63
Changed the logic used to compute the mode elevation and intensity values for strata. This is the same changed done in V3.61 to detect and prevent a divide-by-zero
error but I missed it for the strata calculations. The real problem was that the min/max values for the strata can be the same so their difference is zero. This
can happen if there is only 1 point in the strata or if the min/max just happen to be the same.

2/14/2020 RepairGridDTM V1.05
Added an error message if output DTM file can't be opened to update header after the data for the DTM has been created. This may happen on
slow drives (usually network attached storage) when the data is written and the file is closed but can't immediately be re-opened to 
update header information. This shouldn't be a problem but I am seeing some strange behaviors with NAS drives and multi-processor runs.

1/28/2020 GroundFilter V1.84
Added /reclass:# option to reclassify points as ground points (class 2 normally but can be changed with the optional # parameter) while keeping all other points in the file.
Points that are already classified as ground will be set to class 1 if they are not determined to be ground points. You can use this option with the /class option
to limit the classification testing to specific classes of points. For example, if you don't want to consider noise points as potential ground points, use /class:~7.
Another example if you only want to consider the current ground points, use /class:2 to limit the classification testing to points initially classified as ground (class 2).

When using /reclass and /class options, all points in the file will be written to the output but only those meeting the criteria in the /class option will be considered
as potential ground points.

1/22/2020 Catalog V2.37
Fixed a problem with the output reports when there are bad LAS files. Previous behavior used the min/max XYZ values from the last good LAS file to populate
entries for the bad file. Fixed so min/max XYZ are all set to 0.0.

1/22/2020 LTKStatusMessenger V1.74
Changed the time delay for updating status information from 10 seconds to 60 seconds. I am still seeing multi-processor runs with start-up delays longer than 10
seconds so status updates don't always happen. This is especially true with large numbers of processing tiles as this takes longer to draw. Each tile has 
several update messages so there are lots of (probably unnecessary) redraws when a run starts and status information for all tiles is immediately updated. The
indication that the delay is being exceeded are residual lock files after a run is finished.

1/17/2020 FilterData V1.68
Added the /invert option to filter points below ground. The logic subtracts the point elevation from 10,000, does the filtering, then subtracts the point from
10,000 again to "reverse" the inversion. I only tested the /invert option with the outlier2 method.

1/10/2020 LDA2LAS V1.45
Added /bytime:duration option to facilitate dividing data stored by flightline into smaller tiles for subsequent processing.

Fixed a problem with the /bylines option. This option would not work without LASzip.dll. Code was not in place to use native FUSION LAS I/O.

12/18/2019 AreaProcessor V1.87
Experimental version that allows you to only process specific blocks. I haven't figured out how to create a useful interface to this capability so
the feature is only available in beta versions of AP. Once I settle on an interface, this will be included in the release version.

10/24/2019 AreaProcessor V1.86
Modified the message reported by the status monitor when each block is finished to include the block identifier. This will further help clarify the message regarding processing status
that were added in V1.83. 

8/28/2019 PDQ V2.53
Minor update to clean up reporting of LASzip.dll in the about box.

7/23/2019 GridMetrics V3.62
Fixed a problem with the profile area metric. For some areas without data, a value of -9999.9 was being output instead of -9999.0. This creates scaling problems and analysis
problems. This was only occurring in tiles where there was no valid point data in the lower section of the tile. As soon as valid data is encountered in the tile, the correct
NODATA value is used.

6/19/2019 GridMetrics V3.61
Also corrected a problem when computing mode values for strata. There was the potential for a divide-by-zero error when there is only 1 point in the strata. This is an error
that should have shown up before but I'm not sure why it hasn't been a problem. It could be that the new development tools have more extensive exception handling capabilities.
The error only occurred with the strata mode calculation and not with the metrics for points in the entire cell.

6/17/2019 PDQ V2.52
Updated logic to modify the program name shown in the title bar to reflect 32- or 64-bit builds. Name will be "PDQ" for 32-bit build and "PDQ64" for 64-bit build.

6/10/2019 FUSION V4.00...version held same
Finished changes that let you use FUSION without a background image. If you load point files first thing, an image showing the extent of each point 
tile is automatically generated and set as the background image. This means you can load very large sets of tiles and not have to worry about creating an
image to use as a background. Also, if you load a project that does not have an image but has point files, a new image will be generated and set as the 
background.

Also updated logic to reflect the build in the program name on the window title bar. For 32-bit builds, the name is "Fusion" and for 64-bit builds, the
name is "Fusion64".

6/7/2019 GridMetrics V3.60
Added a new metric: profile area. For details, see A simple and integrated approach for fire severity assessment using bi-temporal airborne LiDAR data, 
Int J. Appl Earth Obs Geoinformation, 78 (2019) : 25 - 38. In FUSION's implementation, percentile height values are normalized using the 99th percentile
height instead of the maximum height as in the paper. This was done to prevent problems when high outliers are present. In addition, the area is computed
using the percentile values (1% breaks) instead of fitting a polynomial to the data. In testing, I found very little difference between the areas computed
directly and those computed from a fitted curve and there are problems determining the best polynomial form (order) that works across a variety of structure
types.

5/22/2019 CloudMetrics V2.70
Added a new metric: profile area. For details, see A simple and integrated approach for fire severity assessment using bi-temporal airborne LiDAR data, 
Int J. Appl Earth Obs Geoinformation, 78 (2019) : 25 - 38. In FUSION's implementation, percentile height values are normalized using the 99th percentile
height instead of the maximum height as in the paper. This was done to prevent problems when high outliers are present. In addition, the area is computed
using the percentile values (1% breaks) instead of fitting a polynomial to the data. In testing, I found very little difference between the areas computed
directly and those computed from a fitted curve and there are problems determining the best polynomial form (order) that works across a variety of structure
types.

Changed the code that computes metrics for strata so it always computes the strata metrics...even when there are too few points for other metrics. Previous
versions did not compute the height or intensity metrics for strata if there were too few points above the height threshold for other metrics. This was really an error
because all points are used for the strata metrics. In the code, the strata metrics were being computed but not reported when there were too few points for other
metrics. This also resulted in a difference in behavior and outputs when compared to GridMetrics.

4/30/2019 GridMetrics V3.51
Changed the logic used to compute the mode intensity/elevation/height value. GridMetrics was crashing when all points in the cell had the same intensity/elevation/height. For lidar
data this was rare (maybe never) but for DAP-derived point clouds, this can happen. This may have also been a problem with very small cell sizes where the number of 
points in the cell is small.

4/30/2019 CloudMetrics V2.61
Changed the logic used to compute the mode intensity/elevation/height value. CloudMetrics could crash when all points in the cell have the same intensity/elevation/height. For lidar
data this was rare (maybe never) but for DAP-derived point clouds, this can happen. This may have also been a problem with very sample sizes where the number of 
points in the sample is small.

4/26/2019 FUSION V4.00
Corrected a problem with the image display that was corrupting memory and causing random crashes. This was a problem introduced in the shift
to the new developement environment. There were some code files mixed up causing a mismatch between class definitions and implementations.

4/1/2019 FUSION V4.00...version held same
Added extra check when using CGeoReferencedImage objects to use m_GeoInfoIsValid in addition to checking that the underlaying CImage was valid.

Corrected a problem with the image display that was corrupting memory and causing random crashes. This was a problem introduced in the shift
to the new developement environment. There were some code files mixed up causing a mismatch between class definitions and implementations.

Changed document object to allocate space for components at run time rather than compile time. This shifts memory use from the stack to the heap.
Allocation happens in the constructor for CFusionDoc. I initially had this in the OnNewDocument method with freeing of memory in DeleteContents
but found problems when opening stored project settings and trying to load them. Memory had been freed and OnNewDocument is not called. Moved the allocation
to the constructor and the free to destructor and things seem happy.

4/1/2019 ClipData V2.71 and any other programs the write LAS files
Fixed a problem with LAS files containing extra bytes in the header but not in VLRs. I was adding the extra bytes to the header size but the header size should 
already reflect this addition according the specifications.

2/25/2019 ClipDTM V1.54
Removed the logic that adjusted the origin of the output model to be a multiple of the cell size. This doesn't make any sense as the default behavior and 
will result in offset values when clipping a model whose origin is not a multiple of the cell size.

2/14/2019 ClipDTM V1.53
Minor change to suppress display of /nolaszipdll option for command line. Previous version displayed this option even though the program does not use/read
LAS files.

2/13/2019 MergeDTM V1.53
Added /halfcell switch to force alignment with "raster" data using the same cell size. This option expands the computed extent by 1/2 cell all around the 
perimeter of the output model. Also added currnet model count to verbose status output.

1/28/2019 PDQ V2.51
Fixed a problem with the color used to show withheld points when coloring according the LAS classification values. Previous versions used color 12 instead of 
color 14 and the withheld flag was not being correctly detected for LAS 1.4 format files that used point record formats 6 and higher.

Also reworked the colors used when coloring by classification code to use 32 colors and added a dialog to interactively control which returns are colored. This 
revision allows control over 32 classes. I also implemented a dialog that allows control over all possible classes (256) but it gets a bit busy and I suspect that
almost all users are only interested in the first 32 classes. Dialog is accessed by pressing "L" (not case sensitive) when viewing a point file.

12/19/2018 ReturnDensity V1.28
Added /last and /only options to compute density products using only last returns (return number matches the number of returns in the pulse) or only returns
(first returns with only 1 return for the pulse). These options are only available when using LAS or LAZ format files. Calculation of intensity percentile
information is disabled when using either /last or /only. Also added a check to make sure input files or in LAS or LAZ format when either of these options
is used.

12/13/2018 AreaProcessor V1.85
Made changes to the logic used to write the processing scripts to correctly parse the run date when working in different locales. There were problems using the DOS DATE command
to get the current date. The output from the DATE command varies depending on the locale set for the computer. The changes use the WMI commands to get a locale-invariant date string.
Output from the DATE was used to build folder names for outputs and for some locales, the folder names were being created with incorrect date information.

10/22/2018 FirstLastReturn V1.28, PolyClipData V1.68, FilterData V1.66, GroundFilter V1.82
Fixed a bug related to producing multiple output files in a single run using input point files with extra bytes after the file header in LAS V1.4 format. In such a run,
the first file would work correctly but subsequent files would produce LAS files with errors because the extra bytes were not being written to the output file but
the count of extra bytes was being used to calculate the offset to the start of the point data.

Also made a change to the base LAS writing code to maintain the legacy compatability for LAS V1.4 files that use point record formats < 6 and have fewer than ~4.3
billion points. Previously the code was populating the "legacy" values in the header with 0s for all V1.4 files.

10/10/2018 ClipData V2.70
Fixed a bug related to doing multiple clips in a single run and having input point files with extra bytes after the file header in LAS V1.4 format. In such a run,
the first clip would work correctly but subsequent clips would produce LAS files with errors because the extra bytes were not being written to the output file but
the count of extra bytes was being used to calculate the offset to the start of the point data.

Made an additional change on 10/19/2018 related to the memory for extra bytes in and after the LAS file header. I am pretty sure I just missed a part of the code
when I made the changes on 10/10/2018. These changes are marked with 10/19/2018...there are 2 locations (close together) where I made changes

Also made a change to the base LAS writing code to maintain the legacy compatibility for LAS V1.4 files that use point record formats < 6 and have fewer than ~4.3
billion points. Previously the code was populating the "legacy" values in the header with 0s for all V1.4 files.

9/28/2018 AreaProcessor V1.84
Fixed a problem when creating shapefiles for return density, ground, delivery tile, processing tile, and block shapefiles. Error was causing AP to crash when you clicked the option
to create the batch scripts

9/25/2018 Catalog V2.36
Fixed a problem when index files exist. With certain command line option, it was reported that the index creation failed. This didn't cause any further problems
but made it look like something had gone wrong.

9/17/2018 PDQ V2.50
Changes to the translation-mode controller (fly through data...press the V key) to use a rough ground surface to set the viewpoint elevation when within the point
data. Added depth cueing (fog) to help differentiate near and far points and added controls (+ and -) to raise and lower the viewpoint relative the rough ground
surface. The rough ground surface is built using the lowest points in the cell and the surface is always 64 by 64 cells. There can be cases where that are no 
points on the ground within the cell resulting in a jump in the surface. Hopefully these cases will be rare. There is no smoothing or hole-filling for the rough 
surface.

9/4/2018 - 10/10/2018 *********** Changes to all programs *************
Code changes to move to "modern" development environment (MS Visual Studio 2017). Lots of small code changes needed to adapt to the new compiler. Also making changes
to prepare for 64-bit versions of some programs. Additional work over the next several months to produce 64-bit versions of programs that work with points and
surfaces. Biggest advantage is more memory available so tools can work with more points or larger surfaces. 64-bit version appear to be slightly faster. All of 
the command line tools will shift to their 64-bit version if the environment variable FUSION64 is set to any value. In operation, this transfer to the 64-bit
version is transparent but there is an entry in the LTK log documenting the transfer. This variable can be defined system-wide so that all FUSION-related programs
automatically envoke their 64-bit versions. However, the FUSION program and PDQ do not do this automatic transfer so you have to explicitly use the 64-bit 
version.

8/17/2018 FUSION V3.81
Changed the data limits dialog when creating an image from point data to provide a better display with 16-bit intensity values. Also fixed a few dialogs so
they could be closed using the "X" in the window title bar.

8/17/2018 AreaProcessor V1.83
Added a warning when there is no projection file specified. When processing using the example scripts included with FUSION, there will be problems with most of the outputs
if there is no projection file. I considered making this a required parameter but you don't need to have projection information for some types of processing.

Added message for the status monitor when the post-block script is started. Previous versions reported a message that was misleading (Processing complete) and several users
reported that they had closed command prompt windows that were still running resulting in an incomplete run.

8/10/2018 PDQ V2.46
Modified the logic used when loading and rendering large DTM files. PDQ can now handle much larger files/grids. When the model is too large to render as
a shaded surface, it is rendered as a colored wireframe. It is still possible to crash PDQ with really large models but this behavior depends on the type and 
memory available on the computer's graphics card. The error seems to happen in a card related dll and the behavior varies depending on the type of card.
Overall the improvements result in much more robust handling of large models.

If you have a large DTM loaded and try to load another DTM, you may get the message that there wasn't enough memory for the normal vectors. When this 
happens, you may be able to load the same model into a new instance of PDQ (exit the running copy and launch again with the new model or drop the
new model onto a new running copy of PDQ. This appears to be a memory management issue but I'm not sure if the problem is in my code or something in 
the way windows manages and releases memory.

Also made some changes to the motion controls when flying through data or over ground models to make the control behavior more useful. Previous versions
tended to look into the ground when moving uphill.

Also changed the way ASCII raster files are loaded so that the points are divided into subsets. This allows for larger grids and helps drawing performance.
When rendering grids, point anti-aliasing is turned off. You may need to change the point size to achieve a good image of smaller grids.

************************************************************************************
8/6/2018  FUSION 3.80 release   ****************************************************
************************************************************************************
8/6/2018 Several programs
Corrected a problem when determining the min/max values for X, Y & Z in data files. Variables for the max values were being initialized to a very 
small positive number. This worked fine unless the coordinates were all negative. For negative coordinates, the maximum values reported were always 0.0.

For some programs, there was no problem but code was changed to provide consistent initial values when determining min/max values.

5/17/2018 ReturnDensity V1.25
Added the /ignoreoverlap switch to control use of the points flagged as overlap point in LAS V1.4+ format files.

5/15/2018 PDQ V2.44
Added and option to prevent continuous drawing (/l) to help in situations where PDQ is running from a server. This dramatically reduces the CPU load
associated with PDQ.

5/15/2018 AreaProcessor V1.81
Added support for clipping options in the area-specific dialog. These options are added to the command line used to clip processing tiles. This helps tailor the clipping to the
specifics needed for each area and lets you take advantage of some of the options that are part of the LAS V1.4 format (like the overlap flag).

Also "relaxed" the check on ground models to allow cases where the maximum elevation is the same as the minimum elevation. This can happen when you have large water bodies and 
the models have been hydro-flattened resulting in an entire ground tile that covers water. Also changed the case where you don't have ground model coverage for a processing block
to report a warning and not prevent creating a processing layout. I was running into cases where you had a very small area within a block that didn't actually contain and valid 
point data. This was usually because all points were classified as water (or some other class being excluded from the processing) or all the points were "overlap" points.

5/15/2018 ClipData V2.65
Added an error check when using the laszip.dll and the sample file can't be opened. Previous versions would crash under this condition. Now an error is
displayed for each sample file that can't be opened.

Also added the /ignoreoverlap switch to control use of the points flagged as overlap point in LAS V1.4+ format files.

4/26/2018 FUSION V3.72
Made changes to the logic used to draw trees on the FUSION display and to pass tree models to the LDV data viewer to accomodate elliptical crowns
that are rotated. Also changed the default symbol name for trees from "circle" to "circle/ellipse".

4/25/2018 LDV V1.64
Changed the logic used to rotate tree models. Previous versions used the wrong origin so models were 90 degrees
off. The change interprets the crown rotation angles as azimuths with 0 at 12 o'clock and angles increasing
in a clockwise direction. Also changed the logic used to scale the models. When using elliptical crowns, the
scaling was being set incorrectly resulting in crowns that were larger than they should have been. For circular
crowns, the size was correct but as the ration of the major and minor axes increased, the crowns were
becoming increasingly larger.

4/24/2018 CanopyMaxima V1.52
Added the /minmax option to change the values output for the min and max crown width. Previous versions output 2*ave_radius
for both the min and max crown width values. The changes allow you to choose from several options for the min and max
crown widths:
	0 = report the max and min crown radii * 2
	1 = report the max and min diameters
	2 = report N-S diameter and the E-W diameter
	3 = report max diameter and the diameter perpendicular to the
	    max diameter line and the rotation to the max line

4/11/2018 AreaProcessor V1.80
Fixed an error in the header written to processing batch files related to the coordinates system information. The labels for values of 1 and 2 were reversed. This was only in the 
comment section of the file so it does not affect any processing.

3/26/2018 TreeSeg V1.80
Fixed a problem with the points output for each crown polygon. Previous version were including points that may not have been within the polygon. This would lead to 
incorrect metrics for the segment points.

3/20/2018 AreaProcessor V1.79
Added functions to create shapefiles that show the ground model file bounding boxes when processing scripts are generated. These are useful when trying to diagnose problems with
a run. There is one shapefile for all of the ground models. It includes the mode resolution (cell size) to help separate fine and coarse resolution models druing the evaluation
process. Also added the same feature for the return density raster tiles used to compute tile layouts.

3/12/2018 AreaProcessor V1.78
Cleaned up the code that keeps track of recent folder use. The change maintains a separate "last" folder for scripts and data. The goal was to make it easier/faster to navigate
between folders when building a run. The data folder is also the output folder. While this may not always be the case, combining the two made sense in the flow of the dialogs
and the order that they "impose" on the configuration of a run. Previous versions only held a single "last" folder so you could find yourself navigating between completely
different folder structures while configuring a run.

3/5/2018 ClipDTM V1.51
Added the /multiplier option to allow unit conversions for DTM files. NOTE: ClipDTM can be called with a huge extent to basically copy
a DTM file. This allows you to easily make unit conversions or corrections without having to convert from DTM to another format and back.

2/14/2018 AreaProcessor V1.77
Added logic to write the working folder in the status file for the job. This lets the status monitor find the log files when the main batch file is not located in the working
directory.

Corrected logic when processing using the delivery tiles and setting the processing options. The change turns off the checkbox "Clip new data tiles before processing" when you 
select the option to "Process using delivery tile extent"

2/13/2018 Several programs
Added code to trim leading and trailing spaces from file names in a list file. If you were using a list file and had extra spaces at the end of any file
names, this would cause problems.

1/25/2018 AreaProcessor V1.76
Added code to clip the processing tiles against the user-specified processing extent (if any). This gives better results when using a processing extent and helps to prevent 
miscalculations regarding the return density for processing tiles.

1/18/2018 TreeSeg V1.74
Changed status output to show the number of points being loaded in the log files. Previous versions only showed this on the screen when /verbose was used.

************************************************************************************
10/12/2017  FUSION 3.70 release   **************************************************
************************************************************************************
9/29/2017 PDQ V2.43
Modified the behavior when cloning PDQ instances so that the window size of the master window is used to size the slave windows. If you change the size of
the master window. the slave windows will also be resized. In addition, I changed the behavior of the slave windows so they cannot clone additional
instances of PDQ.

8/11/2017 JoinDB V1.00
New program to merge values from CSV files (similar to a database join operation).

8/9/2017 CloudMetrics V2.55
Added error message when the output file can't be opened. This was an oversight that should have been corrected long ago.

Changed the error message when a file has no points (either empty or no points above height threshold). Added a message when a file
doesn't have enough points to compute metrics.

Added the /rid switch to parse an identifier from the end of the file name. This was needed to deal with complex file names where
there were several sets of numbers in the file name but the last set of numbers contained the desired identifier.

8/2/2017 TreeSeg V1.73
Fixed a numbering problem for the tree polygons output when the /shape option is used. Segment numbers were off by 2 compared to the raster layer of segments and the segment
number in the shapefile of high points.

Changed filed names in the high point CSV, high point and crown polygon shapefile databases so they match.

Added more capability to work with point clouds and output the subset of points in a segment or within a crown polygon. 

Added output of .csv file that corresponds to the .dbf file created for crown polygons. This was added to help with processing workflows.

7/26/2017 AreaProcessor V1.75
Added code to randomize the stream of random numbers used to generate run identifiers. This allows us to creat unique run identifiers for different processing jobs. This is
needed to provide separate windows in the status monitor. I thought this had been done ages ago but I was still getting the same run identifier every time AreaProcessor was
run. If you generated several processing workflows from a single instance of AreaProcessor, each had a unique identifier but if you closed and restarted AreaProcessor, the first
workflow generated had the same identifer.

7/6/2017 Many programs
Updated programs to work with the latest version of LASzip.dll (June 28, 2017). Programs that write LAZ outputs will use compatibility mode
instead of the "native" V1.4 compression. This will likely change in the next release of FUSION.

6/29/2017 AreaProcessor V1.74
Made a change to remove any spaces in the /class option string specified in Area-specific options. This helps keep runs from failing due to a simple typing error.

Fixed a problem when using multiple overlapping return density layers. Previous versions failed to add together the return counts if layers overlapped. This fix solves
this problem. The error typically affected acquisitions where data were delivered in several areas with each area being processed separately for return counts. The problem
was that areas within the extent of one area that overlapped an adjacent area but had no data in the overlapping area were not being indcluded when computing the processing
layout. The logic was simply using the values from the last return count layer even if they were 0. Now the logic adds together values in areas covered by one or more
return count layers.

6/28/2017 ReturnDensity V1.23
Added /nointpercentile option to suppress output of intensity percentile values for first returns

2/2/2017 PDQ v2.42
Made some changes to accomodate LAS V1.4 files and the new point records for this format. Mainly changed the code to use RGB to color points. Added support
for coloring using false-color NIR ("f" to activate)

2/2/2017 ClipData V2.62
Changed the behavior when using the LASzip.dll so the program name and version are retained in the "generating software" field of the LAS file header.
Previous versions produced files with this field set to identify the version identifier of the LASzip.dll.

1/11/2017 Many programs (all programs that write LAS files)
Added support for writing LAS V1.4 files. This includes support for extended point counts but not full waveform data with the waveform packets
included in the .las file as an EVLR. When waveform packets are stored in an external auxilliary file, the output file should be valid but the waveform
packet file is not modified so it will still include the waveform packets for returns that are not in the output LAS file.

This is a change that involved several programs. Actual changes were made December 2016 through January 2017.

Also made changes to support output of compressed LAS V1.4 files using the compatibility mode in the laszip.dll and to better handle situations where the 
output file creation fails.

Fixed the handling of LAS V1.4 files with EVLRs. All EVLRs are copied to the output file except waveform data stored in an EVLR.

12/8/2016 LTKStatusMonitorMDI V1.20
Changed the logic used to keep track of processing status to use a mutex to control access the the processing tile and block database files. This prevents
missed updates, especially when running with 10+ processing threads.

Also changed the display of the tiles to use a simple black frame instead of a raised frame and forced the status inage to redraw after every status change.

12/8/2016 AreaProcessor V1.70
Changed the logic used to keep track of processing status to use a mutex to control access the the processing tile and block database files. This prevents
missed updates, especially when running with 10+ processing threads.

12/8/2016 LTKStatusMessenger V1.70
Changed the logic used to keep track of processing status to use a mutex to control access the the processing tile and block database files. This prevents
missed updates, especially when running with 10+ processing threads.

12/1/2016 TreeSeg V1.72
Added /ground to the list of valid options. It was left out in the previous versions.

11/28/2016 ASCII2DTM V1.31
Added the /nan switch to trigger the use of more robust (but slower) logic when reading values from the input ASCII raster file. This is to correct
a problem related to reading NAN (not a number) values from the input file. These values do not parse as numbers using the original logic. If you
know your data has NAN values (usually representing NODATA), use the /nan option when converting the files.

11/3/2016 Catalog V2.31
Modified the logic that checks for errors in image cell sizes. Previous versions were reporting an error for products that were not being 
produced. I made changes so the errors are not reported unless the product is being produced.

10/18/2016 GridSurfaceCreate V2.01
Added exception handling to the memory allocation functions to provide more information when an allocation fails. You still get a 
windows error but at least it mentions memory.

10/18/2016 PolyClipData V1.61
Changed the variable type of the point counter to deal with more points. Previous versions would report a negative number of points when the 
number of point exceeded the limits of a 32-bit integer (a little over 2 billion points).

10/12/2016 FUSION V3.61
Corrected spelling mistake on the POI properties dialog.

************************************************************************************
10/11/2016  FUSION 3.60 release   ***************************************************
************************************************************************************

10/3/2016 AreaProcessor V1.67
Added AP_ALIGNMENT_CELLSIZE to the setup information for the processing batch file. This allows you to set the cell size using the alignment cell size.
The standard set of setup and processing scripts does not use this variable but instead define a CELLSIZE variable in the generic setup batch file. You 
must be careful to change all the variables related to cell sizes in the setup batch file if you use the AP_ALIGNMENT_CELLSIZE variable or want to change
the cell size for metrics and other outputs. Errors in the cell sizes won't generally show up until the scipts try to merge block outputs so things
will apear to be working correctly only to fail near the end of the processing.

9/29/2016 ReturnDensity V1.22
Added /projection option to allow you to associate projection information with ASCII raster products. 

9/26/2016 CanopyModel V1.94
Modified the logic used when normalizing point elevations using a ground model to all for situations where some point data are below the 
ground surface. While this really shouldn't happen in practice, we have run across data sets where the ground surfaces are slightly above
some of the point data (usually a few centimeters). However, I ran into a data set where the surfaces were far above some of the points. 
This caused what appeared to be holes in the canopy surface and the filling logic would blend that surrounding area to fill the holes. The 
problem was that these areas were adjacent to trees so the tree canopy was being extended over areas without tree cover. This was causing 
problems with other programs that used the CHM (TreeSeg and GridSurfaceStats). The fix involves adding a threshold that defines what
constitutes a "hole" in the surface. The default value will fill any areas with heights at or below -2.5. This value can be changed 
using the /hole option.

9/22/2016 IntensityImage V1.33
Added /rasterorigin option to force alignment to match other raster products generated from point data (offsets the origin of the image by 1/2 pixel).

9/14/2016 AreaProcessor V1.66
Added logic to clear the extent for data objects whenever an object is deleted from a list and when all objects are deleted from a list. Previous versions
kept the extent and only updated it when objects were outside the current extent. This lead to some wierd scaling when you removed data objects (points, 
density layers, ground models) and then added new data objects.

Also changed the logic that sets the order that blocks are assigned to threads to use the number of tiles in the clock instead of the area covered by
tiles in the block. This may help balance the workload assigned to threads, especially for large jobs with 2x-3x more blocks than threads. For smaller
jobs, you can still end up with 1 or 2 threads that run much longer than the others.

6/24/2016 AreaProcessor V1.61 (beta program not in public FUSION distribution)
Made changes to randomize the starting order of the processing blocks and better balance the area assigned to each processing stream.

6/24/2016 LTKStatusMessenger V1.60 (Former program name was LTKStatusUpdate)
Found the problem with the AreaProcessor status monitor. When the child window in the status monitor is maximized, the CMainFrame window title is 
changed (child window title is appended to the main window title). This makes the call to FindWindow() fail so the update message was never 
getting to the status monitor to trigger an update of the status diaplay.

Solution was to broadcast the update message to all windows...more message traffic but fixes the updates.

6/17/2016 AreaProcessor V1.60 (beta program not in public FUSION distribution)
Added area-specific options dialog and setting to help make the "setup" script more generic. Any parameter files written before this version will
need to be reviewed to make sure they have correct information for the area-specific parameters. The goal of adding these to the AreaProcessor 
parameters was to allow us to use the same "setup" script for all runs. 

6/15/2016 AreaProcessor V1.56 (beta program not in public FUSION distribution)
Added a check for the min/max values in the ground models and density rasters to help find cases where a conversion from ASCII raster to DTM format
failed. The check is simple (is the min >= max) but should catch many of the problems we have seen with format conversions done using the raster package
in R. Also disabled the "Area mask" button since this capability isn't yet implemented.

6/2/2016 AreaProcessor V1.55 (beta program not in public FUSION distribution)
Added an additional check when computing the processing tile layout using return density layers to remove tiles that don't have any data points. The 
previous logic looked to see that delivery tiles overlapped the processing tile but in cases where the delivery tiles have data for flightlines, the
extent of the delivery tile may not accurately reflect the area covered by the actual data points in the tile. The new check takes advantage of the
point count computed from the return density layers.

6/2/2016 ReturnDensity V1.21
Changed the logic so if you are using a user-specified extent (/grid, /gridxy, /extent, or /align), points on the right and top edges
(that is coordinates equal to the maxx or maxy) are not counted in the output. This should let you run the program using adjacent
areas without double counting any returns.

5/31/2016 ReturnDensity V1.20
Added the /grid, /gridxy, /align, and /extent options to allow creation of density products for a specific extent.

5/25/2016 Changed the name of the UpdateIndexChecksum program to RefreshIndexChecksum to fix an issue that relates to needing admin rights
to run the program.

5/25/2016 LTKProcessor V2.02
Changed the name of the status message application from LTKStatusUpdate to LTKStatusMessenger to allow running scripts without admin rights.
Turns out windows requires admin rights if the file name contains the word "update".

This means that scripts generated with older version of LTKProcessor will still require the LTKStatusUpdate program amd admin rights but scripts 
generated with LTKProcessor V2.02 and later will use the new LTKStatusMessenger program and won't require admin rights to run.

5/25/2016 AreaProcessor V1.54 (beta program not in public FUSION distribution)
Changed the name of the status message application from LTKStatusUpdate to LTKStatusMessenger to allowing running scripts without admin rights.
Turns out windows requires admin rights if the file name contains the word "update".

This means that scripts generated with older version of AreaProcessor will still require the LTKStatusUpdate program amd admin rights but scripts 
generated with AreaProcessor V1.54 and later will use the new LTKStatusMessenger program and won't require admin rights to run.

Added more validation checks to make sure the return density and bare ground surfaces cover the area being processed. Previous versions only checked
to see if these data were specified when needed (depending on the processing options). Parameter validation happens as you make changes to various
parameters. If you use the "Validate data" button, you can get a message telling you some of the things that are wrong or inconsistent with the current
set of parameters.

5/25/2016 LTKProcessor V2.02
Changed the name of the status message application from LTKStatusUpdate to LTKStatusMessenger to allow running scripts without admin rights.
Turns out windows requires admin rights if the file name contains the word "update".

This means that scripts generated with older version of LTKProcessor will still require the LTKStatusUpdate program amd admin rights but scripts 
generated with V2.02 and later will use the new LTKStatusMessenger program and won't require admin rights to run.

5/25/2013 LTKStatusMessenger V1.50
Changed the name of the program from LTKStatusUpdate to LTKStatusMessenger to prevent windows from requiring admin rights to run the prorgram. 
It seems that just having the word "update" in the program name triggers the need for admin rights.

5/24/2016 IntensityImage V1.32
Corrected a problem when returns in a file are labeled as return 0. This was causing an array index to result in a memory overwrite and a crash.

5/11/2016 Catalog V2.30
Modified the logic used to set the origin of the image products. There was a specific problem with the intensity images that was resulting
in a shift. The magnitude of the shift depended on the bounding box for the data and the imge pixel size. Also modified the logic used to set
the size of the output images to add 1 row and 1 column. I have reports of misaligned images from some users but have not been able to duplicate
the problems. The changes in this version should help fix any/all alignment problems.

5/11/2016 IntensityImage V1.31
Modified the logic used to set the origin for output products and the intermediate images. There was a problem with the logic used to set the 
image origin (center of UL cell) for the intermediate images that was resulting a shift in the final blended image making it offest down and left
relative to the point data.

4/28/2016 IntensityImage V1.30
Added /projection option to allow you to associate projection information with image products. 
Added /class option to allow filtering by LAS class.
Added /intrange:min,max option to force scaling using absolute intensity values. This allows you to ahve the same scaling as you build images
for adjacent tiles. Modified the code used to create the world file for images. There was an offset that I fixed.

4/18/2016 SplitDTM V 1.11
Added a check to make sure that the output model contains at least 1 valid elevation. If not, the file is deleted and a message is 
printed telling the user the file was deleted and did not contain any valid data. This happens when splitting a model that only has
valid data for ittegular areas within the extent. You may have a corner without any elevations.

4/7/2106 CanopyMaxima V1.51
Added /projection option to allow you to associate projection information with output products. 

3/9/2016 Catalog V2.24
Changed the logic used to determine the data extent when using the /class option and how files are treated when they have all the points
"removed" by the /class option. The logic still counts only the points that are not "removed" but if the file ends up with 0 or 1 point,
the extent information for the file is not used when computing the overall data extent. Also changed the table portion of the HTML report
so file names are red for any files that have 0 or 1 point, have a minimum elevation < 0.0, or have returns labeled as return 0.

3/3/2016 GroundFilter V1.75
Changed the file name used for intermediate surfaces when the /diagnostic option is used to save one DTM for each iteration. Previous
versions overwrote the surface file for each iteration so after a run you only had the last surface file to examine. Intermediate surface
files are always stored in the FUSION install folder.

2/25/2016 CanopyMaxima V1.50
Added the /shape option to output shapfiles of the crown perimeters and maxima points. Shapefiles are named using the output file
name with "HighPoints" and "Polygons" appended to the file name. Also modified to logic used to extract the crown perimeters. 
Previous versions used 16 radial profiles and looked for a local minima along the profile to define the crown edge. The new logic 
still uses 16 profiles but it refines the logic used for detecting the crown edges and smooths the perimeter to remove long, 
thin spikes in the perimeter. Even with the refinements, crown perimeters can overlap because the profiles extracted for adjacent
crowns do not coincide.

2/22/2016 ClipData V2.60
Added the /anglemin and /anglemax options to clip data using the min/max scan angle rank values. This allows you to clip data to remove points along the outside
of each swath. Note that the scan angle rank values in LAS files are integers ranging from -90 to 90 degrees with 0 at nadir relative to the aircraft.

12/23/2015 Catalog V2.22
Fixed a problem when computing the extent for image products and some point files contain no points. For these files, the extent in the 
file header is useless but it was throwing off the extent for the entire dataset.

12/2/2015 CloudMetrics V2.54
Corrected a potential problem if you used the /rgb option with input files in LDA format. Unlikely that this would cause problems but I 
fixed some similar issues in GridMetrics so they needed fixed in CloudMetrics as well.

12/2/2015 GridMetrics V3.43
Corrected a problem that occurred if you used input files in LDA format and the /class option. Technically this combination isn't valid but
there was no testing to see if this combination was used. The "fix" disables the effect of the /class option if any of the input files are
LDA format.

12/2/2015 LDA2LAS V1.41
Fixed some problems when converting LDA format files. The problems were related to the addition of the /bylines option.

11/2/2015 All programs that produce DTM outputs
Modified the logic used to fill holes in surfaces so that it requires values on opposite sides of the hole before any filling occurs.
This helps prevent "filling" beyond the extent of valid data when the extent is a non-geometrically closed polygon.

This change doesn't completely prevent "filling" in areas that don't have data but helps. Different programs use different search radii
when filling holes. In general, the smaller the search radii, the less expansion of surfaces into areas with no data. However, the radii
are expressed in cells so DTMs with large cells can still be looking over large distances to find valid grid values to use to interpolate
a value to fill a hole. I have started to add a /nofill option to several of the programs to provide more control over the filling process.

11/16/2015 CanopyModel V1.92
Added the /return option to allow surface creation using specific returns. Cleaned up some messages when using a specific extent and the 
/class or /return option.

11/12/2015 TINSurfaceCreate V1.50
Added the /return option to allow surface creation using specific returns.

11/6/2015 LDA2LAS V1.40
Added the /bylines option to create output files for data from separate flight lines from a single input file. The flight line number
is appended to the output file name.

11/2/2015 CanopyModel V1.91
Added the /nofill switch to disable hole-filling logic. Previous versions always fill holes in the surface model (usually associated
with areas that have no data points).

10/30/2015 TINSurfaceCreate V1.40
Corrected a problem when you used a wildcard for the input data files that only resulted in a single input file (wildcard only
matched 1 file). TINSurfaceCreate would report that it couldn't open the single file. Also corrected a problem where LAZ files
were not being recognized in an initial check to see if data files could be opened for reading.

10/30/2015 GridSurfaceCreate V2.00
Added the /filldist:# option to give control over the size of holes that will be filled. The default size is 99 cells (radius).
Use care when using small fill distances as you can end up creating pits in ground surfaces where you have sparse ground returns.
There is a balance between the fill distance, the cell size, and the ground point density so you may have to experiment with
different distances for your data to get the "best" results. In reality, the areas that are filled don't contain any data (ground
returns in most applications) so you aren't really losing anything as far as accuracy of the surface goes. Using a large fill
distance generally produces surfaces that "look better" and probably work better for normalizing return elevations to produce
better estimates of tree heights.

The TINSurfaceCreate program may produce more accurate surfaces, but this program is more limited in the amount of data it can 
process due to it's use of a TIN data structure on top of the point data.

10/30/2015 CanopyModel V1.90
Made a change to the code that fills holes in the surface model to reduce problems associated with irregular data coverage within the rectangular
extent of the surface model. Previous versions could interpolate data into areas that were not covered by points. In general, this wasn't 
causing any problems but it produced canopy surfaces that did not truely represent the data (or lack of data) in the input point clouds.

10/29/2015 MergeDTM V1.50
Added /nofill option to prevent hole filling. This should be used when merging files that contain raster data (as opposed to surface data).

10/28/2015 GridSurfaceStats V2.30
Fixed alignment problems that may not have been showing up in all runs. The problem is related to the cell size used for the high-resolution
surface interpolated from the input models not having square cells. This caused distortion in outputs for some runs but not all.

Also worked on the output files to make sure all the data had the correct origin. Because GridSurfaceStats outputs both ASCII raster format
and DTM format files, the handling of the origins needs to be different depending on the output.

************************************************************************************
10/9/2015  FUSION 3.50 release   ***************************************************
************************************************************************************

10/8/2015 SplitDTM V1.10
Added /maxcells option to base the splitting on the size of the model. This makes it easier to split a mix of large and small models
using the same command line. The default maximum number of cells is 25,000,000 giving DTM files that are about 100KB.

9/30/2015 MergeDTM V1.44
Added the exactextent option to preserve the extent of the input models instead of expanding the extent to be a multiple of the output
cell size.

9/25/2015 SplitDTM V1.00 original release
New program to split large DTM files into smaller tiles. This is useful when processing large areas and the ground models have
been delivered in large tiles. During processing, you can hit situations where the processing tile spans 4 (or more) models and
the processing logic loads some of the models but has to access others from disk. This dramatically slows down the processing. If you
split the large models into smaller pieces, only the area needed for the processing a tile is loaded. This makes the processing go faster
in general but especially when working with large ground tiles.

9/25/2015 Several programs
I changed the logic used when displaying syntax for programs so that the /nolaszipdll option is not included for programs that do not
use point data. For previous versions, this command line option was always displayed even if the program did not use point data and the
option didn't do anything.

9/25/2015 MergeDTM V1.43
Modified the logic that keeps track of the min/max elevation value. Previous versions were only considering a double precision value
regardless of the variable type being written to the merged model. This was causing a slight error in the min or max value. The error
could be detected by using DTMHeader to scan the file to determine the min/max of the values actually contained in the file and comparing
the new value to that originally stored in the file immediately after the merge.
 
8/31/2015 Several programs
Chnaged the way the LASzip.dll library is linked to source code to make it easier to update programs when the library changes. This also changes the support
for LAS format files for version 1.4. The new programs should be able to read version 1.4 files provided they have fewer than 4 billion points. 
for larger files, most of the FUSION tools will crash. Some will give a meaningful message but most will not. I am working on updates to support
large version 1.4 files but these changes involve a complete redesign of my indexing logic so they may take some time.

8/25/2015 GridMetrics V3.42
Corrected a problem with skewness, kurtosis, Lskewness, and Lkurtosis metrics when the values for all returns in a cell were the same. Previous
version output a value indicating a divide-by-zero error (-1.#IND". Now the NODATA value is output instead. This error was discovered while
processing data where almost all of the intensity values for all returns were the same. In these cases, skewness and kurtosis are undefined
because there is no "distribution" of values (they are all the same).

8/3/2015 SurfaceSample V1.30
Modified output for radial profiles to include the identifier from the input file and the index of the radial. Also corrected the manual
to clear up whether or not the input point is output for each radial (it is). Changed the logic for radial lines so that the length
is always at least p2 units long. The actual length is rounded up to be an even multiple of the point spacing (p3).

Added additional pattern options:
	pattern 3: p1 is point spacing, p2 & p3 not used. Input file contains endpoints of a single profile (two coordinate pairs per line).
	Output is a uniformly spaced set of points between the endpoints plus the final endpoint.

7/17/2015 GridMetrics V3.40
Corrected a problem with the Elev cubic mean when the return elevation was negative. Resulting value was -1.#IND in CSV outputs. The correction
means that the cubic mean metric is computed by taking the cube root of the sum of the absolute values of the cubed heights for returns in the 
cell. Previous version summed the cubed height (without the absolute value) so the result was different.

7/8/2015 Catalog V2.21
Added /projection option to allow you to associate projection information with image products. 

7/6/2015 PolyClipData V1.60
Corrected a problem when using input LAS files that contain no variable length records (other than the VLR that indicates LAZ compression).
The /multifile functionality would fail (crash) with no output files produced. The work-around was to clip individual polygons using the /shape option
with specific values for the database field. This wasn't a very good solution when you had 100s of polygons to clip.

The problem was related to the code to open the output files using the LASzip.dll. Not a problem with the DLL but my use of the DLL.

6/23/2015 Catalog V2.20
Added option to limit the extent of image products.

6/5/2015 Catalog V2.15
Fixed problem with the validation logic where the maximum return number was being ignored. The value was bring parsed but not used
in the actual tests for validation.

4/20/2015 GridSurfaceStats V2.15
Removed the /multiplier option...the conversion was not being applied correctly for rumple and FPV

3/9/2015 TopoMetrics V1.20
Change to command line structure to include a separate window for topo metrics and TPI. Also added windows sizes to column headings in CSV output

3/4/2015 ASCII2DTM V1.30
Fixed a problem with the underlying code to read ASCII text files. The end-of-line sequence was not being determined correctly. This bug would show up
very rarely but when it occurred, ASCII2DTM would hang forever. This fix will also affect several other programs.

2/23/2015 TopoMetrics V1.10
Modified the behavior associated with the /diskground option. Now the option forces model use from disk. Previous versions were not working
correctly. Also added the /nointernalground to prevent creation of an internal ground model. this was causing problems for large areas. Also changed
the reporting regrading the use of ground models. If an internal model was created, the models used are listed. If not, models in memory and models
used from disk are listed separately. This is to help diagnose runs that seem to run very slowly.

Changed the logic when creating an internal surface model to double the cell size (reduce resolution by 4X) until a model will fit into memory. This
will result in slightly modified surfaces but should not have a major impact on the topographic metrics. You can override this behavior using the
/lockdtmcellsize option.

Added the /lockdtmcellsize option to prevent an increase of the cell size when creating an internal surface model.

2/13/2015 CanopyModel V1.87
Added the /multiplier option to convert elevations in output files from one unit to another.

2/13/2015 DTM2ASCII V1.41
Added the /multiplier option to convert elevations in output files from one unit to another.

2/13/2015 GridSurfaceStats V2.14
Added the /multiplier option to convert elevations from the input canopy surface from one unit to another.

2/10/2015 ClipDTM V1.50
Modified the logic used to extract values from the source grid to avoid errors and shifting data when working with grids with precise
cell sizes (more than 2-3 digits to the right of the decimal point...common when running metric-equivalent cell sizes with data in feet)

1/22/2015 TopoMetrics V1.10
Changed the output to scale the TPI values by a factor of 100. The original Weiss poster does not do this so values for small window sizes
can get pushed to 0.0 or 1.0 when rounded to integers. The change allows small window sizes and preserves resolution in the computed TPI values.

Changed the /annulus option to /annulusdia and added /annuluswidth. /annuluswidth allows you to specify the width of the ring instead of 
the inner diameter. This is useful when you are using multiple window sizes but want the same ring width.

1/16/2015 ClipDTM V1.40
Added /shrink option to allow reductions in the input model extent without specifying the actual extent. The MinX MinY MaxX MaxY
parameters are interpretted as reductions to the left, bottom, right, and top limits of the input model.

1/15/2015 ASCII2DTM V1.24
Added /offset option to allow global adjustments to all data values. This can be used to do a crude adjustment to adjust vertical datums.

1/15/2015 Several programs
Modifed the logic used when working with multiple surface files (DTMs). Changes on 9/30/2014 included remembering the last model used to 
get a valid elevation for a point. This feature caused problems when using coarse surfaces to provide data for areas outside an acquisition
boundary. The logic would continue to use the coarse-resolution model even if one of higher resolution was available. The new logic only 
remembers the last model if it is the same resolution as the highest model in use.

11/26/2014 Several programs...most programs that read point data
Modified the /class option to recognize "~" in the first character of the list of classification codes to mean that the listed
codes should be excluded. The default behavior is to include only returns with the classification codes listed.

11/3/2014 ReturnDensity V1.12
Added check for the amount of memory available for the point count array. If there isn't enough memory, the program exits with an error message.
Also added output for /verbose mode to show the amount of memory needed and the amount available.

10/30/2014 Catalog V2.13
Modifed the behavior when the user specifies a list file for data files and the file can't be opened to report the error. Previous versions
reported and error but didn't give any details.

10/28/2014 MergeRaster V1.31
Added the /precision:# option to allow control of the number of decimal digits in the output file. The previous default was 6 digits
of precision making integer data layers very large (larger than the sum of the input file sizes).

Added the /nodata:# option to allow control of the NODATA value used in the output file. The NODATA value will be written using the 
number of decimal digits specified in the /precision option or the default of 4 digitis.

10/31/2014 ReturnDensity V1.11
Changed default value for point count grid to NODATA and changed behavior so that cells with points but no points matching /first or /class
criteria will have a value of 0 and cells with no points will have a value of NODATA. Points flagged as withheld are not counted as valid points.

10/1/2014 Several programs
Modified the checks on available memory to use the amount of virtual memory instead of physical memory. This should improve stability and
prevent some of the "not enough memory" crashes.

9/30/2014 Several programs
Modified the logic used when working with multiple surface files (DTMs) to prioritize the models with the highest resolution when interpolating
values for points. This allows you to have high resolution models where you have them but also specify a lower resolution model to either
fill in the gaps or provide values for areas outside a LiDAR acquisition. This is especially useful for some fo the tools that use a large window
size that may extend far outside the acquistion boundary.

9/9/2014 TopoMetrics V1.00
Initial release

8/26/2014 Catalog V2.12
Added code to flush the file buffer for the HTML report as different section are written. This should help produce a more useful report
if things crash.

8/27/2014 ReturnDensity V1.10
Added /ascii option to output ASCII raster format instead of .DTM format. This is a more convenient format for further analysis

8/15/2014 LTKStatusUpdate V1.3
Minor changes to field names in shapefile database for block identifiers from AreaProcessor. Program will recognize new and old names.

4/21/2014 DTM2ASCII V 1.40
Modified logic so you can convert a larger DTM file into ASCII raster format. New logic will load entire grid into memory
if possible. If not, it will drop back to the individual point access logic to access and convert the DTM. The point access method
will be slower (2X-5X+ slower) but will allow conversion of very large models.

************************************************************************************
3/28/2014  FUSION 3.42 release   ***************************************************
************************************************************************************

3/28/2014 GridMetrics V3.37
Fixed a problem when using LAZ files. GridMetrics was reporting a "File access time delay loop" error when using LAZ files. The problem
was related to some code cleanup prior to the last release.

3/24/2014 PolyClipData V1.52
Fixed a problem when outputting .LDA files using the /lda option. Program was crashing.

3/18/2014 all programs that write LAS data files
Modified the calculation used to scale coordinate values in output LAS files. This version rounds the scaled integer values to match the
precision specified in the LAS header. Previous version truncated the values resulting in a slight difference between input and output coordinates.

Also modified the behavior of the /precision option to allow increasing the precision represented in a file. While the program allows this,
nothing is gained by increasing the precision since the input data is less precise than the output data. Previous verions did not allow you to 
increase the precision.

3/10/2014 CanopyMaxima V1.44
Modified the error handling when the canopy surface model can't be read or is too large. Previous version did not report an error
if the canopy surface was too large or if there were other problems with the surface. Also moved reporting of a non-existant canopy
surface file to the main body of the program. Previous version reported this error in the command-line parsing logic.

Corrected a problem where the fist line of tree output data was appended to the column headings.

2/28/2014 GridMetrics V3.36
Corrected a problem where a topographic metrics file was being produced when there were no points in the tile. The header for the file
contained invalid values for the number of rows and columns and caused CVS2GRID and MergeRaster to fail. Now no topographic metrics
file is output unless there are points within the processing area

************************************************************************************
1/28/2014  FUSION 3.41 release   ***************************************************
************************************************************************************

1/23/2014 FUSION V3.41
Modified file open dialog when adding data files to include compressed LAS (LAZ format) files and added a warning that using LAZ files
will result in very slow performance when extracting and viewing samples.

Also added beter format detection when adding data, hotspot, and POI files. Previous logic could end up with the wrong file type leading
to irregular behavior and crashes.

1/22/2014 GridSurfaceCreate V1.96
Fixed a problem when using LAZ files. The command line parsing code was trying to verify that data files existed and it attempted
to open LAZ files before the LASzip.dll was loaded. The result was an error message that indicated that the data file(s) could
not be opened and the program terminated.

1/15/2014 GroundFilter V1.71
Minor documentation change for the CellSize parameter. This cell size if for intermediate surfaces used while filtering the points. It is
not the cell size for the final surface model. The final model will be created from the set of filtered ground points using GridSurfaceCreate
or TINSurfaceCreate.

Added the /extent and /trim options to allow filtering for a specified area. Ideally the extent will be larger than the trim area to help
provide continuity when filtering data in multiple tiles and to minimize edge artifacts in gridded surfaces produced from the bareground
points. The extent area is used to select input points and the trim area is used to limit output points to the specified area.

1/6/2014 MergeRaster V1.31
Added reporting of output file and improved error reporting when input files don't exist or a wildcard specifier doesn't match any files.

Also added the /compare option to report when adjacent input grids have different values in overlapping cells.

************************************************************************************
12/16/2013  FUSION 3.40 release   **************************************************
************************************************************************************

10/31/2013 LDA2LAS V1.30
Added /class option to help when cleaning LAS files. This allows you to output only points with specific classification values. Most often
the /class option will be used to remove outliers (class=7).

10/30/2013 CSV2Grid V1.34
Added error message when output file can't be opened.

10/21/2013 Catlog V2.11
Modified the logic used when point files contain only a single point. Such files cause problems in the calcualtion of point density
since a since point doesn't have an extent (or the extent has no area). Point files with a single point (or no points) are excluded from 
the reports and images products produced by Catalog.

9/25/2013 Catalog V2.10
Added the /validate option to produce a summary of all "problems" with LAS input files. This option is useful when you run into 
acquisitions of individual data files that fail during processing tasks. The information provided in the validation report identifies
files that do not comply with the LAS specification. This includes tiles that have points that are outside the extent defined in the 
file header and points with invalid GPS time. Both of these problems can indicate issues that should be addressed by the data provider.

9/24/2013 ClipData V2.51
Added the /cleanlas option to output only points that conform to LAS specifications (through LAS version 1.3). This option eliminates points
outside the extent specified in the LAS file header, points with invalid GPS times, points with return numbers <= 0 or > 5, and points
flagged as withheld.

Fixed a problem with some of the status information reported when using the /verbose option. Messages were not being output for input files
that were not indexed.

9/16/2013 Catalog V2.02
Modified the CSV output when counting returns. Moved the return count columns after the point density and total number of points.
This allows the catalog file to be used as input to other programs.

9/13/2013 PolyClipData V1.50
Changed the logic used when clipping using some of the polygons from a shapefile. The old logic tested the extent of each point tile
against the bounding box of the shapefile to see if it needed to scan the file looking for points in the polygons. The new logic only
tests using the extent of the polygons being clipped. This change significantly improves performance when clipping of few polygons from 
a shapefile with lots of polygons or when clipping from a shapefile that covers a large extent compared to the extent of the polygons 
being clipped.

8/27/2013 FilterData V1.40
Modified the default number of points used for the minimum and maximum filters to 1 instead of 3.

Major change to logic used to write points when using the minimum and maximum filters. The new logic removed the need to jump to and read
specific points in the input files. This was causing very poor performance when using compressed files for input. The new structure seems 
to run about 10X faster than the old for non-compressed files and even faster when using compressed files.

8/15/2013 - 10/18/2013 All programs that read or write LAS data
Added support for the LASzip.dll developed by Martin Isenburg to read and write LAS and LAZ files. To use the library you simply need to copy 
it to the same folder where FUSION is installed. If the library is present, it will be used. If it is not present, the older code that does not support
compressed LAS data will be used. Use of the /nolaszipdll option in any program will suppress loading of the library and will remove support
for compressed LAS data for that instance of the program.

I also added code to all programs that read LAS data to ignore parts flagged as "withheld" in the LAS point records. According to the definition of 
"withheld" in the LAS specification, these points should not be used in processing.

8/15/2013 IntensityImage V1.22
Correcteed a problem when using the /jpg option. Intermediate files were being saved with the .jpg extension but in BMP format. This
was causing a crash when the intermediate images were read back to create the final image.

8/15/2013 ClipDTM V1.33
Changed to report details for output file and added output of the final (possibly adjusted) extent when using /verbose.

8/13/2013 GridMetrics V3.35
Modified the logic used when computing topographic metrics to expand the extent of the ground surface used for the calculations
to cover the full extent of the area defined by the larger of a buffer around the extent for metrics and the area defined by the 
extent for metrics and the topogrphic analysis cell size. Previous versions only considered the buffer and could end up computing
incorrect topographic metrics when the topographic cell size was larger than the buffer.

7/18/2013 ClipData V2.44, GroundFilter V1.64, FilterData V1.33, FirstLastReturn V1.12, MergeData V1.23, PolyClipData V1.45, ThinData V1.43, LDA2LAS V1.12
Changed the way the extent of the output point cloud is computed when writing LAS format. Previous version used the actual coordinates
represented as floating point numbers to compute the extent. Now the extent is computed using the scaled coordinates (scaled coordinates are
stored in the file). This should eliminate warning when lasinfo (lastools) is used to examine the file header.

6/14/2013 PolyClipData V1.44, ClipData V2.43, FilterData V1.32, FirstLastReturn V1.11, GroundFilter V1.63, MergeData V1.22, ThinData V1.42
Added the /precision option to allow users to specify the scaling factors used when writing LAS output files. The normal behavior is
to scan the input files and use the smallest scaling factor for the output. However, I ran into some files where the scaling had been
computed to maintain 9 digits of precision and this caused problems for the signed 4-byte integer type used to store the XYZ values.
I limited the scaling to 0.00001 by default but you can override this using the /precision:scaleX,scaleY,scaleZ option. For most data,
scale factors of 0.01 or 0.001 are sufficient to maintain the precision of the laser instrument.

5/28/2013 All command line programs
Added the /locale switch to control use of locale-specific numeric formatting for input and output. This option controls the thousands and
the decimal separators for all ASCII text output from the command-line programs. When /locale is used, programs adopt the conventions 
for the location maintained by Windows (regional and Language options in the control panel). Use this switch when you are having trouble
reading ASCII data and you suspect that the data may be using a comma as the decimal separator.

5/22/2013 DTM2ASCII
This is not a change but a note about program behavior. For almost all applications, you should use the /raster option in DTM2ASCII to prevent
shifts of 1/2 the cell size when moving data between the PLANS DTM format used in FUSION and ASCII raster format used in GISs. I have received
several "bug reports" where users are seeing 1/2 cell offsets when converting data to and from ASCII raster format and, in almost all cases, the cause
can be attributed to not using the /raster switch in DTM2ASCII.

5/22/2013 Several programs
Changed the precision when writing ASCII raster files. Some programs used 4 decimal digits and other used 6 digits. All programs should no use 6 digits.
Also changed the precision of the NODATA value to use no decimal digits. This should make ASCII raster files smaller when there are large areas with
NODATA values.

5/22/2013 GridSurfaceStats V2.12
Added /ascii switch to output surface in ASCII raster format with .asc extension. The ASCII raster files are output instead of DTM format files.

5/22/2013 Canopy Model V1.84
Added /ascii switch to output surface in ASCII raster format with .asc extension. The ASCII raster file is produced in addition to the .dtm file.
Also corrected the syntax displayed for /surface option. You cannot use a wildcard or list of files as the output file.

5/3/13 PolyClipData V1.43
Corrected a problem with shapefiles and negative coordinates. The code used to determine the bounding box for a polygon was ignoring
negative X values. This behavior was a carryover from support for other polygon formats that indicated holes using a negative X value.

4/17/2013 ClipData V2.42
Modified the logic used when input data does not cover the sample area. Previous version could appear to have run correctly without reporting an
error or producing an output file.

Also noted a behavior that should be documented...if you are using ClipData to normalize data relative to the ground after an earlier clipping
operation (e.g. extent is 0 0 10000000 10000000), don't use /shape:1 (circular sample) in the command line. If you do, you might end up in
a situation where the data in the input file is outside of the circle defined by the artificially large extent. 

************************************************************************************
2/22/2013  FUSION 3.30 release   ********************************************
************************************************************************************

2/21/2013 LTKProcessor V1.98
Made a small change to the batch file generated when clipping and saving new data tiles. Removed the "()" around the tile name as this
was causing trouble for the DOS command processor and breaking the test for errors during the clipping.

2/21/2013 ClipData V2.41
Modified the logic when clipping samples with the /ground option to check to see if any of the data tiles overlap the sample area before 
creating a ground model.  Previous versions did not check prior to creating a ground model. This speeds up clipping for lists of samples
and for single samples.

2/20/2013 FUSION V3.30
Bumped the overall version number to do a new release. No changes to FUSION (2d viewer) since version 3.22.

1/31/2013 GridMetrics V3.33
Corrected a problem with the cubic mean elevation metric for cells with no returns. The NODATA value being written was
incorrect. -9999.9 was being written instead of -9999

1/29/2013 GridSurfaceStats V2.11
Added error trapping and message when input file can't be accessed or doesn't exist.

1/18/2013 CloudMetrics V2.52
Corrected a problem with output when using the /firstreturn and /minht options. The "Total return count" in the output
was the count of all first returns instead of all returns. Also changed the label on the number of returns above the 
/minht threshold to reflect whether or not only first returns were used.

1/11/13 Catalog V2.00
Corrected a problem with memory allocation when not creating all of the image products. The size used to test if enough
memory was available for the image products was not ignoring image products that were not being produced. The result was
a test for an extremely large image (array) and often the test failed so Catalog would report that there was not enough
memory to vreate the image products.

11/16/2012 CloudMetrics V2.51
Corrected a problem where metrics for samples with very few points (too few to compute most metrics but at least 1 point)
contained an extra column of data with a value of 0.0.

11/5/2012 LTKProcessor V1.97
Added option to force use of LDA format files when clipping new data tiles. When this option is used, you must include the /LDA option
with any FUSION command line tools that produce point cloud output. There is no advantage to using LDA format files and most users
will not use this option. If you have saved clipped tiles runs over 2 years ago, they may be in LDA format so you will need to use this
option to reprocess the tiles using the option to "check for clipped tiles". If you have recently expereinced problems with the tiling options:
"Compute tile arrangement using width and height" or "Compute tile arrangement using Max returns", this version should correct these 
problems.

Also made a small change to the logic that calculates the tile arrangement so it does not compute an arrangement when the Cell size is 0.
This fixed an intermittant bug that locked up LTKProcessor with an error that you needed to "enter a number."

11/5/2012 CanopyMaxima V1.43
Added output of 16 crown radii at end of tree records with the use of the /crad switch.

10/30/2012 FUSION V3.22
Minor changes to logic when drawing data layers. Added display of file name currently being drawn. Changed logic when re-drawing the
main display. There have been problems with inconsistent drawing of the backdrop image and failure to erase the screen when zooming
or panning. The changes may cause more frequent redraws but should eliminate the problems where the screen was not cleared and the image
was not redrawn.

10/29/2012 ClipData V2.40
Fixed a problem with the handling of GPS times (related to /timemin and /timemax). I ran into some LAS files that had bad information 
for the GPS time and the values were causing trouble with the logic used to implement the new options in V2.39.

10/25/2012 MergeRaster V1.30 and other programs the use ASCII raster file
Fixed a problem when merging very small rasters or a set of rasters that included very small rasters (2 rows by 3 columns). The logic
used to read the file headers was failing on the small files.

10/24/2012 CloudMetrics V2.50
Modified the logic used for outlier removal so it does not negate the effect of /minht and /maxht options. Outlier removal 
is now treated independently from /minht and /maxht. You can still specify options that in incompatible. For example,
/minht:2.0 and /outlier:3,100 will omit returns with heights from 2.0 - 3.0.

10/16/2012 CanopyMaxima V1.42
Added terms to the search window size calculation to accomodate 4th and 5th order polynomials.

10/16/2012 ViewPic V1.30
Modified the code that reads BMP images to work with path/file names longer than 128 characters.

************************************************************************************
10/15/2012  FUSION 3.21 release ********************************************
************************************************************************************

10/15/2012 LTKStatusMonitor V1.32
Made some changes to LTKStatusUpdate to fix a problem introduced in FUSION version 3.20. The status monitoring function was not
working correctly due to the release of some experimental code in the program used to communicate status changes (LTKStatusUpdate).
Also modified the behavior when the enter key is pressed when the LTKStatusMonitor window has focus. The new version does not
close the LTKStatusMonitor window.

10/15/2012 LTKStatusUpdate V1.1
Modified some logic along the way to use a run identifier as part of some work to deal with multiple jobs running concurrently and 
inadvertantly left the output of the identifier in the command passed to LTKStatusMonitor. This was causing LTKStatusMonitor to
ignore the update commands ans show no progress.

************************************************************************************
9/21/2012  FUSION 3.21 release *********************************************
************************************************************************************
9/20/2012 Several programs
Modified the code used to read LAS format files to deal with extra data stored with each return. Evidently the ability to include the extra bytes has been
"available" since version 1.2 of the LAS specification although there is no documentation in the specification describing the feature. All of the FUSION
programs will be able to read LAS files with extra bytes of data associated with each return. In addition, any programs that compy or otherwise write
LAS format files will preserve the extra bytes in their output.

8/22/2012 Catalog V1.99...experimental...LAZ support not included in V3.20
Added support for LASLIB to read LAS and LAZ files. LASLIB replaces the original code I developed to read LAS files. The
change results in faster file reads (about 15%) for uncompressed files and adds support for compressed LAS (LAZ) data. 
Other formats are still read using my original code.

Corrected problem with the /newindex switch. The switch was not being recognized as a valid option.

8/22/2012 GridMetrics V3.32...experimental...LAZ support not included in V3.20
Added support for LASLIB to read LAS and LAZ files. LASLIB replaces the original code I developed to read LAS files. The
change results in faster file reads (about 15%) for uncompressed files and adds support for compressed LAS (LAZ) data. 
Other formats are still read using my original code.

8/22/2012 CloudMetrics V2.40...experimental...LAZ support not included in V3.20
Added support for LASLIB to read LAS and LAZ files. LASLIB replaces the original code I developed to read LAS files. The
change results in slightly faster file reads for uncompressed files and adds support for compressed LAS (LAZ) data. 
Other formats are still read using my original code.

8/21/2012 ClipData V2.39
Added /timemin and /timemax options to allow cliping of LAS files based on the GPS time for individual points. The values used for the option
are interpretted in the time units of the data files. The LAS specification allows for GPS time to be expressed as weekly time (seconds since
midnight on Saturday) or as GPS time (standard GPS Time (satellite GPS Time) minus 1 x 10^9).

*****8/10/2012 FUSION...not for public knowledge
Did some experimentation with linker settings for both debug and release builds. Added /NODEFAULTLIB:LIBC to the linker command line and 
the warning regarding LIBC conflicting with other libs went away. Also changed the jpeg library for release builds to match the one used for debug 
builds (common/jpeg-7/libjpeg.lib).

8/6/2012 LTKProcessor V1.96
Corrected a problem when using a custom analysis extent. Tile corners and sizes were not being calculated correctly when you had the "align
to cell grid" checked. 

************************************************************************************
5/16/2012  FUSION 3.10 release ***********************************************
************************************************************************************
5/7/2012 GroundFilter V1.62
Modified the logic used to detect command line errors to do a better job with invalid data files

4/12/2012 CanopyMaxima No version change
Updated the FUSION manual to reflect the method used to compute crown widths for "trees" detect in CanopyMaxima. The previous description
did not correctly describe the logic being used.

3/30/2012 PolyClipData V1.42
Corrected a problems when using multiple polygons and putting all the points from all polygons into a single file. 3/15/2011 "fix"
caused problems when using multiple polygons within a single shapefile but having all output go to a single point file.

3/28/2012 PDQ V 1.91
Modified logic that assigns point colors using LAS RGB information to correctly scale the color components. Previous versions
assumed the color components ranged from 0-255. Modifications scan the RGB colors and figure out if the range is 0-255 or 0 - 65025.
The LAS standard does not specify the component range but allows a 16-bit value for each of the red, green, and blue components.

3/26/2012 CloudMetrics V2.39
added /rgb switch to compute intensity metrics using red, green, or blue color values from LAS version 1.2+ files
with RGB values for each return (point record formats 2, 3, & 5). LAS version is not actually checked because
some LAS writers do not correctly output the format version.

Use caution when using the /RGB switch since the output columns for the Intensity, R, G, and B metrics are the same. It
is very easy to mix outputs from runs intended to compute the metrics using the color values with each other and those
where the actual intensity value was used to compute metrics.

3/26/2012 GridMetrics V3.31
added /rgb switch to compute intensity metrics using red, green, or blue color values from LAS version 1.2+ files
with RGB values for each return (point record formats 2, 3, & 5). LAS version is not actually checked because
some LAS writers do not correctly output the format version.

Metrics for the Intensity, Red, Green, and Blue color components are ouptut to files labeled to indicate their content.

************************************************************************************
2/7/2012  FUSION 3.01 release ***********************************************
************************************************************************************

2/7/2012 LDV Version 1.62
Modified the tree measurement dialog to allow the use of the measurement line to input tree height, height
to the base of the live crown, and crown diameter. Also added a checkbox to the dialog to control this feature.

1/26/2012 ClipData V2.38
Added the /nooffset option to modifiy the offset stored in LAS file headers. The goal is to produce an output point file
that cannot be located on the globe. This feature is necessary when you need to have point clouds for locations that cannot
be released. (e.g. confidential inventory plot locations)

1/6/2012 GridMetrics V3.29
Modified the values output for metrics when there are no points in a cell. Previous versions output 0 for some return count metrics 
and -9999 (NODATA) for others. Starting with this version, all metrics have NODATA values when there are no points in the cell.

Also fixed a problem with the counts of individual returns when there were 3 or fewer returns in a cell. Previous version set all 
individual return counts to 0. Starting with this version, the individual return counts reflect the actual counts in the cell when there
are 3 or fewer returns in the cell.

1/5/2012 ClipDTM V1.32
Changed the signature included in the output DTM file. Previous versions had a signature from a different program.

12/14/2011 Several programs
Corrected a problem when using the /class switch to compute metrics for points with the specified LAS classification codes. Only values
from 0-15 were being processed correctly. The change ensures that values from 0-31 are processed correctly.

12/12/11 FUSION V3.01
Lots of changes to command line programs but not to FUSION/LDV. Biggest change to command line programs is that they all output
LAS format files when working with LAS files as inputs. The LDA format is slowly going away.

12/12/11 FUSION V3.00
Ongoing development version that was released to a few individuals (mainly research collaborators). Never released via the FUSION 
distribution web site.

12/12/11 ClipData V2.37
Modified the logic used to establish the offset for LAS output files to better deal with the case where you
use an artificial extent to clip an entire input data file. The offset was being set to the LL corner of the clipping
area which in many cases would be (0,0). the new offset in the LAS file header is now the larger of the clipping area 
and the origin of the input data.

12/8/2011 LDV Version 1.61
Special changes to zooming logic when using the CTRL-Left mouse button combination. Added a small dot to the 
center of the measurement marker disc.

12/6/2011 CSV2Grid V1.33
Added the /ndzero option to replace NODATA values (-9999.0) in the CSV file with 0.0 in the ASCII raster file. 
This option requires a column that contains the value that will be tested to see if the substitution should happen. 
If the value in the "test" column is >= 0.0, then the substitution will occur. If the value is < 0.0, the ASCII 
raster file will still have NODATA for the cell.

11/29/2011 GridMetrics V3.29
Added an /nointdtm option to prevent creation of an internal DTM when processing using the /grid, /gridxy, and /align options. For some 
datasets, the creation of the internal model was resulting in a problem with the metrics along the top and right edges of the data extent.
For most uses, this option is not needed. The case where problems arose involved a small rectangular dataset and metrics computed using a relatively 
large cell size. The internal ground model was being created with 1 extra row and column but the extra row and column were not being populated
with valid elevations since they were technically outside the data coverage area. As a result, the returns along the top and right sides
of the data extent were not being correctly adjusted for height above ground. This caused the elevation metrics to have incorrect values
for the cells along the top and right sides of the extent.

11/16/2011 GridMetrics V3.28
Fixed a problem when computing strata metrics using the /strata or /intstrata options. The decision to compute the strata metrics was being
made based on the number of returns above the minimum height for other metrics. This resulted in bad metrics for any cells that did not have
enough returns above the minimum height to compute the "normal" metrics. The "bad" strata metrics were actually the values from the previous
cell that had enought returns to compute the "normal" metrics. The same change was not necessary in CloudMetrics since it only computes
strata metrics when there are more than 3 returns in the point cloud. When there are 3 or fewer returns, 0s are output for the stata metrics.

8/31/2011 Gridmetrics V3.27
Changed the default behavior with ground models so that an internal (in memory) model is not automatically created. In previous versions
an internal model was being created and this process was taking a very long time so the overall processing times were going up by a 
factor of 10. Still not sure exactly why processing was so slow but eliminating the extra time needed to create the internal model
seems to speed up processing.

6/4/2011 CanopyModel V1.82
Modified the logic when using a specific extent for the canopy model to speed up the processing. Previous version read through all
data tiles that overlapped the extent and reported the number of data points within the extent. this information was not being used
for anything other than reporting so the logic was modified to count the number of data points while the canopy surface was bring 
produced.

4/27/2011 Catalog V1.97
Added /noclasssummary to turn off the option that creates a summary of returns by LAS classification values. Only effective
for LAS format data files. Default is to always produce the summary but this requires reading every data file and makes the 
summary quite a bit slower.

4/13/2011 PDQ V2.0
Added /m command line option to allow multiple instances of PDQ and /s command line option to synchronize multiple copies. To use these
options, you must start PDQ from a DOS prompt or batch file. Synchronization includes to viewing geometry, point size, and focal length.

Also added "Clone PDQ" to menu to launch another instance of PDQ that is syncronized with the current instance. The role of a particular
instance of PDQ is displayed in the lower right corner of the heads-up information. The "master" role will control all other running 
instances of PDQ and the "slave" role only listens and will not send viewing updates to other instances of PDQ. It is possible to have 
several instances of PDQ in the "master" role.

Also added code to use the correct icon for the window's title bar

4/11/2011 LTKStatusMonitor V1.3
Corrected the logic used to position controls when the window is resized to set the correct positions for the "Browse" and
"Show tile status" buttons.

3/17/2011 GridMetrics V3.26
Fixed initialization problem with P05 and P95 layers when using the /raster option. NODATA areas were getting the wrong value.

Added more logic to check for access to data files to help get around problems opening data files while other activities on the
computer have locked the files or otherwise are preventing access. The new logic will try to open the data file set several times
with a 10 second delay between each attempt. From experience, this should give programs a chance to finish what they are doing with
the data file set. Most problems have been the result of virus scanning activities on Forest Service-imaged computers so others
may not be having the problems with large processing jobs where a few tiles fail.

3/15/2011 PolyClipData V1.40
Modified to save LAS format when all input data are in LAS format. Added /lda option to output LDA format. If input data
are not all LAS format, output format will be LDA.

3/15/2011 FilterData V1.30
Modified to save LAS format when all input data are in LAS format. Added /lda option to output LDA format. If input data
are not all LAS format, output format will be LDA.

3/14/2011 GroundFilter V1.60
Modified to save LAS format when all input data are in LAS format. Added /lda option to output LDA format. If input data
are not all LAS format, output format will be LDA.

Also changed output logic to only output parameter information when the /verbose option is used.

3/14/2011 FirstLastReturn V1.10
Modified to save LAS format when all input data are in LAS format. Added /lda option to output LDA format. If input data
are not all LAS format, output format will be LDA.

3/14/2011 MergeData V1.20
Modified to save LAS format when all input data are in LAS format. Added /lda option to output LDA format. If input data
are not all LAS format, output format will be LDA.

3/11/2011 MergeRaster V1.20
Changed the logic used to test the alignment of input grids to the final merged grid and the logic used to compute the number
of rows and columns in the merged grid. Previous versions had trouble with rasters that had high precision cell sizes and could
compute the wrong extent and number of rows/coumns in the output. Noticed the problem with cell sizes with 3+ significant digits
to the right of the decimal place. The precision of several calculations was causing slight errors in the calculations and either
reporting that input files did not match to grid arrangement or incorrectly calculating the number of rows and columns in the merged
grid and causing an error.

3/4/2011 ThinData V1.40
Changed default output format to LAS when using LAS-format input files. If not using LAS-format input files, 
output will be in LDA format. Added /lda option to output LDA format. If input data are not all LAS format, output format will be LDA.

2/28/2011 LTKProcessor V1.93
Added option to check for clipped data tiles prior to doing a new clipping operation. Clipped tiles must be in the working folder. Turning
on this option will help folks who clip new tiles and save the tiles for later processing.

Also fixed a problem when aligning the tile grid to the cell size when computing cell sizes using the number of returns. Previous versions
were not doing this correctly and would report an error with the alignment.

1/25/2011 ClipData V2.36
Fixed a problem when an invalid input filename was given on the command line. Previous versions did not report an
error but simply terminated as if everything was OK without producing any output file.

Also fixed a problem with the /ground switch...was not be recognized consistently

Changed the output format to LAS when working with input files in LAS format. Also added the /lda switch to force
output of FUSION's LDA format although there is no reason to use LDA format. If any of the input data files are
not in LAS format, the output file will be written in LDA format.

Modified code structure to use new common code for FUSION utilities.

1/14/2011 GridMetrics V3.25
Restructured code to provide better organization and make it easier to maintain and distribute FUSION source code. Also removed
references to JPEG and TIFF image libraries (can be easily controlled using #define INCLUDE_OUTLIER_IMAGE_CODE) to reduce the
executable size and eliminate the need for the image code in the public distribution.

Added new options: /strata:[#,#,#,...] /intstrata:[#,#,#,...] /kde:[window, multiplier]

Added new metrics: Canopy relief ratio, height strata (elevation and intensity metrics), MAD_MED, MAD_MODE, #modes
from a kernal density function using the return heights, min/max mode values, min/max range

1/14/2011 CloudMetrics V2.35
Restructured code to provide better organization and make it easier to maintain and distribute FUSION source code.

Added new options: /strata:[#,#,#,...] /intstrata:[#,#,#,...] /kde:[window, multiplier]

Added new metrics: Canopy relief ratio, height strata (elevation and intensity metrics), MAD_MED, MAD_MODE, #modes
from a kernal density function using the return heights, min/max mode values, min/max range

12/17/2010 Catalog V1.96
Added a summary table showing the number of points by LAS classification values. The summary info is valid for only LAS format
files. If you use a mix of LAS and other formats in the same run, the summary tables will not reflect the overall data set.

12/9/2010 PDQ V1.90
Added optional rangepoles to help establish scale in point cloud and surface displays. Rangepoles can be a scaled to the data or
a fixed size. The rangepole height can optionally be considered when computing the scaling for the data display. This allows you 
to compare various point clouds or produce a series of images that can be directly compared since the display scaling is controlled
by the rangepole height.

Rangepole display is controlled on the View menu and the options are on the File...Rangepole options... menu

12/6/2010 CloudMetrics V2.34
Corrected some variable names to match those output in GridMetrics: 
	Elev InterquartileDistance changed to Elev IQ
	Int InterquartileDistance changed to Int IQ
Changed the capitalization of some of the variable names. For the most part the rule is that the first letter of the column
heading is capitalized and no other letter. If a word in the heading is an abbreviation, it is capitalized. For example, CV for
coefficient of variation.

11/10/201 Several programs
Added logic to almost all command line programs to check for invalid command line switches. Prior to this change, most
programs would not report an error if you used an invalid switch. 

This change was a hard one to test given that it affects all command line programs and it is hard to try all combinations
of command line syntax. If you find any documented command line switches that are reported as invalid, please let me
know ASAP (bmcgaughey@fs.fed.us). Include the command line used to run the program in your email.

11/10/2010 Catalog V1.95
Added command line parameter verification logic.
Added support for /class switch...previous version used /lasclass. /lasclass will still work but users should use /class in any
new scripts. Also fixed behavior when doing LAS classification summaries. Previous version were not limiting the summary to only
points with the specified classification values.

11/9/2010 Several programs...follow-up to changes made on 8/17/2010
Made some changes to the logic used when normalizing point data and surfaces using a ground model. The new logic should
make any program that uses a ground surface much faster. In testing with GridSurfaceStats performance was increased by
a factor of 50. Not all programs will show the same level of improvement but nearly all programs will be faster by some amount.

11/3/2010 GridSurfaceStats V2.0
Added /grid, /gridxy, /align, and /extent switches to compute surface stats using a specific extent.
This makes output from GridSurfaceStats more compatible with output from GridMetrics

11/2/2010 PDQ V1.84
Minor change in the description of keyboard commands in the Help...About dialog. "N" toggles
between using the intensity data to color returns. Previous versions indicated that "N"
toggled between RGB using values and point elevation for coloring points.

11/2/2010 CloudMetrics V2.32
Added the /outlier switch to make the command line sytnax more consistent with GridMetrics. The /outlier:low,high
switch has the same effect as using both the /minht:low and /maxht:high switches. The values specified via the /outlier
switch will override the values specified with the /minht and /maxht switches.

11/1/2010 GridMetrics V3.23
Added /id:identifier switch to all a user specified identifier that is included in the last column of the output data.
This is most useful when you want to combine output from a series of GridMetrics runs into a single CSV file but you
still want to identify the metrics with a specific area. The identifier cannot contain spaces.

10/28/2010 ClipData V2.34
Corrected documentation for the /return switch. The "F" option yields the first and only return for a pulse
not the "first of many" as described in the syntax information.

9/7/2010 LTKProcessor V1.91
Modified the post-processing portion of the batch file to make the working directory current before calling the post-processing
command. This would happen if running the entire batch file but if you only wanted to run the post-processing, the change to
the working directory didn't happen correctly.

8/26/2010 PDQ V1/83
Added support for LAS files with RGB information for each point. PDQ will
use the RGB color to color the points. The intensity (N) and LAS classification
coloring methods will override the RGB colors when toggled on.

8/26/2010 FUSION V2.92 and most other programs
Added support for LAS format 1.2 and 1.3 with point record formats that contain RGB color information. 

Also added sample option in FUSION to color data points using the RGB colors from LAS files.

Cleaned up display of last data clip at program start-up.

8/18/2010 ClipData V2.33
Modified the logic used when doing a single area to better handle a ground surface model. If you were using
an "artificial" extent for the sample (sample includes all points in the input data files(s)), the previous
version tried to create an internal model for the full extent. This version scans the input data and creates
an internal model using the smaller of the extent of the input data and the sample area.

Modified the logic that creates an internal model in memory so it only creates an internal model when there
isn't enough memeory to hold all surface models in memory or the area of the sample extent is 25% less than
the area of all surface models involved in the sample.

Also enhanced the logic used to handle ground models in memory...affects several LTK programs

8/18/2010 LTKStatusMonitor V1.2
Increased the amount of text that can be displayed from the log file for an individual tile from 64k to 128k

8/18/2010 LTKProcessor V1.9
Added commands to the tile processing batch file (when created using LTKProcessor) to save the buffered tile corners
in string variable that can be used in the tile processing batch file after parameters are shifted

8/18/2010 GridMetrics V3.22
Corrected a problem with the data extent computed when using the /class switch. Previous versions used all data points
to compute the extent instead of using only points with matching classification codes. In general, this won't have caused
problems except in cases where the classifaction code was linked to the spatial position of the data points. 

Also enhanced the logic used to handle ground models in memory...affects several LTK programs

8/18/2010 CanopyModel V1.80 & GridSurfaceCreate V1.93
Added options to force a specific model extent and to align model with existing DTM file (/grid, /gridxy, /align, /extent)
to match options in GridMetrics. In GridSurfaceCreate, added /maximum switch to use maximum point elevation in the cell
instead of the average elevation of all points in the cell.

Also enhanced the logic used to handle ground models in memory...affects several LTK programs

8/17/2010 Several programs
Enhanced the logic used to handle surface models (usually ground but not always) to better deal with loading models
and creating a new model in memory when working with large models or areas. Previous logic worked well but didn't 
always do things in the most efficient manner.

8/13/2010 LTKProcessor V1.8
Added the ability to specify an analysis extent that is different from the overall data extent. This way you can analyze
only a portion of the area covered by a group of data tiles. Also cleaned up the behavior when you delete the last file 
in the list of tiles. Some of the data summary values were not being properly cleared.

8/11/2010 FUSION Version 2.91
Added support for images with 4 bands where the 4th band contains the information needed to display
the image using false-color infrared. When you load such an image, you will be given the choice
to display the image using false-color IR. You choice will be stored and loaded from FUSION projects.

Fixed potential memory leak related to loading a stored project that contained either a ground or canopy surface where
the surface file no longer existed. Previous versions allocated space for a 10 by 10 patch of data from the surfaces
even though the surface could not be loaded. This probably wan't causing any problems for anyone but it needed fixed.

Added cursor info dialog to the View menu to show current location in a form that can be copied. The position
displayed in the status bar can't be copied. To copy values from the dialog, Hold the Ctrl key to "lock" the currnet
location. Then move the mouse to the position dialog and copy the desired value(s).

8/2/2010 LDV Version 1.60
Corrected a problem when displaying the ground surface with transparency. If you changed the transparency,
turned off the surface, and then loaded a new sample LDV would crash when you turned on the surface again.

************************************************************************************
7/7/2010 FUSION 2.90 release *******************************************************
************************************************************************************

6/2/2010 ClipData V2.32
Modified test for the correct number of command line parameters. Previous versions were checking for 
too few parameters.

Added ability to clip several samples in a single run and greatly improved the performance when clipping
several small areas from large acquisitions. See the syntax for changes.

Modified the logic used to count points for which the DTM provided a valid elevation. When using /dtm
with other options (/class or /return), the counts were not done correctly.

Added logic to interpolate a ground DTM for the exact sample area. This generally leads to more efficient
processing compared to loading a large model into memory for a small sample. This also speeds things up when
doing multiple samples on the same command line.

5/27/2010 GridMetrics V3.21
Corrected a problem with the L moments metrics. When setting NODATA values for cells with too few points to compute
metrics, the L moment metrics were not correctly set to NODATA values. In general this should only affect runs with very
sparse point data or with very small cells.

5/24/2010 DTM2TIF V1.2
Added /mask switch to produce a mask image showing areas with valid data values. In the output image, 
a value of 255 indicates a cell with valid data and a value of 0 indicates a cell with invalid 
data (NODATA value)

5/24/2010 CSV2Grid V1.31
Modified the logic used to parse values from columns to be a little more efficient. CSV2Grid runs slower as the 
column gets large due to the time needed to parse the values in columns up to the requested column. This change
removed some calculations and tests that were being performed for all columns. The net result cuts the conversion
time in half (less for low column numbers and more for large column numbers)

4/27/2010 FUSION V2.81
Correct a problem using ARC generate files for points as POI layers. The points were not being drawn. Added the option in the POI file 
types for point files and line/polygon files. Both types use the /gen or /arc extension so you need to make sure you pick the right type
or the layers will not draw correctly.

4/16/2010 GridMetrics V3.20
Modified the logic that handles ground models to use the CTerrainSet class and changed the behavior of this class
so it creates an in-memory ground model covering the analysis extent. This makes for more efficient ground model
handling when individual ground models are large and multiple models are needed to cover the analysis extent (which
is usually small compared to the individual ground model extents). This should prevent situation where ground models
are used from disk while interpolating ground elevations for individual returns.

4/15/2010 Several programs
Improved ground model handling logic so that it builds an internal model using several individual DTM files and then uses the model to 
interpolate values for returns instead of loading several models into memory. This cuts down the amount of memory needed when 
working with small areas (compared to the size of individual DTM files). This also lets LTKProcessor compute the amount of memory 
needed to provide ground elevations for a specific extent to help when processing large data blocks. this logic change affects all programs
the work with ground surface models.

4/7/2010 ClipData V2.31
Modified logic when using zmin and zmax and a DTM so that any points outside the DTM area or in holes
within the DTM are omitted from the sample.

4/6/2010 LTKProcessor V1.7
Added several options to better work with individual tiles. Logic to process a single tile is built into the master
batch file. Run a single tile by specifying the full tile identifier on the command line for the master batch
file. Run the post-processing batch file by specifying POST on the command line for the master batch file. The
pre-processing batch file is always run. You can also restart a processing job by using RESTART and the tile name
on the command line

Added option to create a log file for each processing tile. This is used in LTKStatusMonitor to display tile processing
status information.

Changed the default state of the "Align to cell grid" checkbox to TRUE

4/5/2010 GridMetrics V3.12
Added support for /minht switch (same meaning as /htmin switch) to prevent mishapes when using command line options
from CloudMetrics

4/5/2010 CanopyModel V1.74
Added better reporting when a data file can't be opened (either doesn't exist or is locked for some reason). Previous 
version simply reported that there were no data points but did not mention that the file couldn't be opened.

3/29/2010 CSV2Grid C1.30
Minor correction to display run header information (program name, command line, and start time). Previous
version did not display this information.

************************************************************************************
3/15/2010 FUSION 2.80 release **********************************************
************************************************************************************

3/11/2010 CloudMetrics V2.30
Added file title to output as a separate column from the filename. This helps when the point data files are named
using a meaningful name (such as plot identifier). The /id option also provides an identifier for each line of data
but only works with numbers in the file name. This new column contains the full file name.

2/25/2010 LTKProcessor V1.6
Added "Add list" button to add data files from a text list.

2/19/2010 CloudMetrics V2.20
Changed /htmin to /minht to match GridMetrics. /htmin is still recognized but not documented. Added /maxht
option to better match GridMetrics. In practice, it is best to use this option when clipping data samples with
ClipData and then simply use CloudMetrics to compute the metrics. However, some analysis processes are better served
when you can use this option with CloudMetrics (e.g. computing metrics using height slices via /outlier).

2/19/2010 MergeDTM V1.40
Added hole filling logic for final merged model. Only works when entire model can be loaded into memory.

2/18/2010 GridMetrics V3.11
Added /extent switch to force output to align with a DTM file but still adjust the output extent to be an even multiple of the grid cell size.
This addition is very similar to the /align option but with /align, the output origin and size are not adjusted to align with a multiple
of the cell size. You can use this option when computing metrics using data tiles along with the /buffer option to eliminate edge
effects in the merged rasters of metrics.

2/3/2010 CloudMetrics V2.10 & GridMetrics V3.10
Added code to compute L moments and moment ratios. Added 14 columns to output (7 each for elevation and intensity values).

1/13/2010 FUSION V2.8
Changed the logic used to draw tile outlines when displaying raw data to read the extent info from the LAS header when an index
isn't available. The tile is drawn with an "X" when the index is present and an "X" and a "+" when it is not. Since most folks
are now working with LAS data, this will produce a better display prior to indexing. This might be a little misleading because the first
sample that is attempted will trigger indexing of all data files but at least you can see the data coverage.

Added additional logic to speed up samples when using LAS format files or any indexed data file format (LDA). New logic does a much
better job of figuring out which tiles should be used to build the sample before reading the index or data. The first sample done
in FUSION with a given set of data tiles will be slower but subsequent sample are much faster.

Corrected problems in the sample options dialog that allowed range truncation when coloring by pulse number and LAS classification
codes and disabled color controls when coloring by LAS classification codes.

Corrected a problem when coloring using the abs(nadir). There was a scaling problem that caused intermittent crashes and incorrect
coloring of the points

12/10/2009 CSV2Grid V1.21
Modified the behavior with NODATA values to recognize the -999900.0 that GridMetrics was incorrectly putting in cells 
with no returns above the height cutoff value. CSV2Grid now changes the -999900.0 value to -9999.0

12/10/2009 GridMetrics V3.01
Corrected a problem that was causing cover values for cells with too few points to be set to the wrong NODATA value.
(-999900.00 instead of -9999.00). This was causing problems in ArcInfo.

12/8/2009 DTM2ASCII V1.3
Added /raster switch to move origin from center of lower left cell to lower left corner of the cell. This facilitates using the 
DTM format for "raster" data where the point value represents the attribute for the entire cell instead of a point sample.

12/4/2009 GridSurfaceStats V1.8
Modified the logic used to allocate memory for temporary arrays to allow larger arrays and to be more robust. Also 
modified the logic so that larger areas can be processed. The large areas are divided into vertical strips to cut down 
the size of the high-resolution array needed for intermediate surface area and volume calculations.

11/25/2009 GridSurfaceStats V1.7
Modified the output surface to use the same origin as the input surface. Previous versions added 1/2 the cell width 
and height to get the origin. Also made the output area 1 cell wider and 1 cell taller to make sure the output covers 
the extent of the input surface.

11/25/2009 CanopyModel V1.73
Corrected a problem when using a ground surface to filter outliers but not to normalize the point elevations. This feature 
wasn't producing a good canopy surface model.

11/24/2009 Several programs
Corrected a problem when creating .dtm files using 2-byte integers for the elevation values. Any model created with more rows
than columns were likely to cause problems either when created or when read. This problem was created 8/12/2009 and
the affected programs were never released as a formal FUSION version. Hence, this problem should not cause any problems
for almost all FUSION users.

11/24/2009 CanopyModel V1.72
Corrected problem with the logic used to create the return count .dtm file. CanopyModel was crashing just after the 
file was created. The return count file could be read but had some problems in its header.

11/18/2009 LTKProcessor V1.5
Modified the logic used to test for grid cell, tile size, and buffer alignment. Added option to load all LAS, LDA files from a folder 
(instead of selecting specific files). This addition also includes the ability to specify a "custom" filter to load any file
types (must be a supported format).

Many other changes to streamline interface and use better error trapping in the processing batch files.

11/13/2009 CanopyModel V1.71
Changed logic when using ground model to compute canopy heights. When the canopy points have no valid ground elevation
the canopy model is set to NODATA. This should eliminate the "wall" around the edges of the data block

11/13/2009 GridSurfaceStats V1.6
Modified logic used with ground surface model (/ground switch) to accept more than 1 model.

Also changed logic when using a ground surface to normalize elevations to insert NODATA values when the area of 
the surface is outside the ground model or the ground model doesn't have a valid elevations for a cell in the surface.

11/12/2009 DensityMetrics V1.31
Modified the logic used when a point is outside the coverage area of the ground models. Previous versions used the 
point with its true elevation so the max height outputs potentially had spikes/walls around their edges. The change 
removes the spikes and makes the outputs much cleaner.

Added support for the /grid, /gridxy, /align, /buffer, and /cellbuffer switches. Behavior is the same as GridMetrics. 

Also added the /slices switch to allow specification of custom height breaks for slices.

11/12/2009 Catalog V1.94
Added better error trapping for memory allocation related to creating the image products. This should help when processing
large areas. Previous version would fail without an error message or at least without a useful error message.

10/30/2009 SurfaceSample V1.2
Added /sri:dist.latitude switch to compute solar radiation index (SRI) and other topgraphic attributes for the input point locations.
SRI is computed as described in Keating, K. A.,P. J. P. Gogan, J. M. Vore, and L. R. Irby. 2007. A simple solar radiation 
index for wildlife habitat studies. Journal of Wildlife Management 71(4):1344-1348 except the range is modified from the
original range of -1.0 to 1.0 to a range of 0.0 to 2.0. When /sri is used the elevation, slope, aspect, profile and plan curvature
and SRI values are output for each sample location.

10/26/2009 LTKProcessor V1.4
Added new logic to produce a new analysis arrangement based on a pulse density layer (typically produced using the 
Catalog utility) and made several other changes including making the button to view the data file arrangment actually
display something.

10/23/2009 FilterData V1.20
Fixed problem using min/max filters and LAS format files. Resulting file was garbage.

10/23/2009 Several programs
Modified the logic used to read ASCII text files to work with files with long lines (more than 1024 characters in 
the first line of the file). Previous logic could not identify the end-of-line sequence correctly if the 1st line
of the file was longer than 1024 characters. This change was needed as the headers in the output from the latest
version of GridMetrics is longer than 1024 characters.

10/16/2009 GridMetrics V3.00
Modified logic so intensity metrics and elevation metrics are computed using a single run of GridMetrics Output is 
maintained in separate files and the cover values area only saved in the file with elevation metrics. The /nointensity 
switch was added so you can compute only the elevation metrics. Fuel model application only happens on the pass 
when computing elevation metrics. The /intensity switch was removed and testing for combinations of /fuel and 
/intensity were disabled.

Also changed the order of the columns int the CSV output and added several new metrics so the output from GridMetrics 
matches output from CloudMetrics

Added all the new variables to the /raster switch so you can produce a DTM or ASCII raster firl for specific metrics.

Added /topo:dist,lat switch to compute topographic attributes using the ground surface model. A new grid is interpolated 
with cells that are dist- by dist- units. Latitude is assumed the same for the entire project area.

Modified logic used to create file names for raster ouput (/raster switch) when producing ASCII raster files to use the 
extension ".asc" instead of ".dtm"

10/13/2009 MergeDtm V 1.32
Fixed a problem when a list file is used to specify DTM to be merged and the list only contains 1 file. The numeric 
type used to store the data (elevations) in the merged model was being set to 2-byte integer regardless of the type 
used for the single model. The new version sets the storage type to match the single model.

9/16/2009 CloudMetrics V2.0
Modified the logic used to compute metrics related to cover. Now the /above:# switch also triggers calculation of the 
proportion of returns above the mean and mode elevations (or heights) and the cover value using all returns (instead 
of only first returns).

Also added columns for the number of returns by return number and the point counts used for the cover calculations.

Cleaned up variables computed and output
+removed median and duplicate 50th percentile columns (median is the same as 50th percentile and this value
 was output 3 times in the file)
+added coefficient of variation
+re-ordered percentile values...moved 25th and 75th percentile values into sequence of other percentile values

Also added /first switch (deos the same thing as /firstreturn switch) to maintain consistency with GridMetrics.

9/9/2009 Several programs
Added /class switch to facilitate using only specific returns from LAS data files (defined by the classification value).
This option was previously added to a few LTK programs. This revision adds it to most of the programs that work with 
point data.

9/9/2009 GridSurfaaceCreate V1.92
Added /class:string switch. This replaces the /lasclass:# switch but the /lasclass:# switch is maintained for backward 
compatibility. /class allows more classification values and is consistent with all other LTK command line programs.

9/8/2009 Cloudmetrics V 1.90
Added the /alldensity switch to compute cover metrics using all returns instead of only first returns. This was added to
make CloudMetrics behave like GridMetrics (which also has the /alldensity switch). This option affects the original cover
metric as well as the new relative cover metrics (cover above the mean and mode height values.

8/25/2009 Several programs
Added logic to better deal with quotation marks in command line arguments and switches. Now you can surround a switch
that has a parameter after the ":" with quotation marks (used when a file path or name contains spaces) like this:
	"/ground:my ground.dtm"
or you can simply surround the file name by quotation marks like this:
	/ground:"my ground.dtm"

8/21/2009 FUSION V2.73
Minor change to incorporate latest JPEG images support library from the Independent JPEG Group's JPEG software. I didn't 
see any major things fixed since the old version of the library but thought I should keep current.

8/19/2009 Catalog V1.93
Added standard deviation of all return and first return densities over the entire dataset to the HTML output. These statistics
are only available when either the /density and /firstdensity switches are used.

Also changed behavior when creating image products using first returns (/firstdensity and /intensity). Some LAS files do not
contain valid return numbers. For such files, return number 0 is considered a first return. This lets Catalog create images
using data that has no valid return numbers. HTML output has extra notes when Catalog detects return numbering problems.

8/12/2009 Several programs (all programs that work with .DTM files)
Improved the error trapping when loading data into memory. this should make this process much more robust. Previous versions
of several programs would crash with a cryptic error message when tere were problems loading a model. The new code should
at least provide some useful information when things don't work. In many cases, programs will default to use the .DTM file
from disk when loading the model into memory fails. The new code will make this process more reliable.

8/10/2009 GridMetrics V2.90
Added new metrics: proportion of first returns above the mean elevation/height and proportion of first returns above the mode 
elevation/height value. The new metrics are produced in the standard output CSV file and are available as options to the 
/raster switch. Also changed the output of cover metrics in the CSV output to range from 0 to 100 instead of 0 to 1 to match
the output from CloudMetrics.

7/28/2009 Catalog V1.92
Fixed problem when the report file given on the command line could not be opened. Previous versions crashed when trying 
to create the HTML report file if the CSV file path was not valid.

Fixed minor reporting issue when index files exist and /countreturns is specified. The index is not used when /countreturns 
is active but the old message stated incorrectly that the index failed.

7/23/2009 GroundFilter V1.50
Added /class switch to facilitate using only specific returns from LAS data files (defined by the classification value)

7/23/2009 DensityMetrics V1.30
Fixed problem reading list files with a blank line at the end of the file. Previous version would hang. Added /class switch 
to allow use of specific returns from LAS data files.

7/21/2009 Cover V1.5
Changed logic for ground surface models to allow multiple models. Added /class switch to allow use of specific returns from
LAS data files

7/20/2009 CanopyModel V1.6
Changed logic for ground surface models to allow multiple models. Also changed behavior when there is a problem with the 
ground surface model (using /ground switch). Previous version created the model without normalizing relative to the ground model.
The new behavioir is to abort since user obviously wanted to normalize or else they would not have used the /ground switch 
in the first place. Added /class switch to allow use of specific returns from LAS data files.

7/14/2009 ClipData V2.21
Modified the logic used to figure out if a data file contains points in a sample to work better with LAS files that are not indexed.

7/14/2009 Several programs
Fixed problem reading list files with a blank line at the end of the file. Previous version would hang.

6/10/2009 CanopyModel V1.5
Added /surface switch to allow outlier filtering based on height above ground while creating canopy surface models where
the resulting surface is the elevation at the top of the trees. When /surface is used in conjunction with /outlier and 
/ground, point elevations are normalized using the ground surface elevation and then tested against the outlier parameters
to see if they should be used for the final surface. When /oulier and /ground are used without /surface, the resulting surface
is based on height above the groudn surface. The /surface switch is ignored unless the /outlier and /ground switches are
also used.

6/10/2009 FUSION V2.72
Increased the maximum number of data files that can be included in a FUSION project from 512 to 2048.

6/10/2009 ASCII2DTM V1.2
Modified the conversion logic so that the PLANS DTM files produced by ASCII2DTM for grids that use floating point elevations
are stored using 4-byte float types instead of 8-byte double types. This cuts the model storage size in half. The precision
offered by the 8-byte double type is not needed as GRID files in ArcInfo generally don't have more that 4 decimal places. This
change also affects all programs that use DTMs because the resulting models use half as much memory when loaded.

6/8/2009 GridMetrics V2.8
Added the /class switch to specify the LAS returns used for metrics based on their classification code.

6/8/2009 ClipData V2.2 GridMetrics V2.8
Modified logic used when selecting/omitting LAS returns based on their classification code.
New logic is more efficient regardelss of how many class are specified in the /class switch.

5/21/2009 ThinData V1.2
corrected problem with the size of the grid used during the thinning process. Program was failing with some combinations 
of density and cell size

5/7/2009 Catalog V1.9
Added /uselascounts switch to use return count from LAS file headers when /countreturns is specified.
Terrascan does not populate these items with valid numbers so you have to check a few of the data files
to make sure the header has valid numbers for the return counts. When you know the headers have the 
information, this option will speed up the processing (eliminates 1 complete read of the data files).
Also changed prompt when scanning data file to count returns to include "file # of #"

4/20/2009 PDQ V1.6
Added support for copying current image to the clipboard using the edit menu or Ctrl+C or Ctrl-Insert.

4/14/2009 LTKProcessor V1.3
Modified logic to increase the number of files that can be added to the file list from 1024 to 4096 and added better 
handling when the user tries to add too many files to the list. In addition the maximum number of files that can be
added at one time was doubled. The number of files added at one time depends on the length of the file names and the 
length of the path (folder name) for the files. If you have been using LTKProcessor for projects with less than 1000
data files, you won't notice any changes.

4/10/2009 MergeRaster V1.1
Changed the behavior when specifying a list file on the command line. Original behavior looked only for an extension
of ".txt". New behavior also check to make sure no wildcard character is included in the list file name. The new
interpretation of "*.txt" is to expand the file specifier to find a files with an extension of ".txt". The old behavior
would have been to read the "*.txt" as a list file and report the the file could not be found or opened.

4/8/2009 FUSION V2.71
Added support for tiled TIFF images as backdrops. The tiling refers to the internal storage method used in TIFF images.
Previous version simply gave a message that tiled images were not supported. The new logic has been tested with 24-bit
images only.

3/13/2009 LTKProcessor V1.2
Modified logic that checks the alignment of the analysis grid and the cell size to provide a warning when the user asks to align 
things to the cell size and the tiles size and/or buffer size are not a multiple of the grid cell size

3/13/2009 PDQ V1.5
Added option color LAS point clouds using the classification code for each return. "L" toggles the coloring from the default
brown-to-green to color by return classification. The Help...about dialog shows the colors and classification codes. Also
changed program name in the Help...about menu from fullwindow to PDQ.

***************************************************************************************************************
CHANGES RELATED TO OLDER VERSIONS ARE IN REVERSE CHRONOLOGICAL ORDER
***************************************************************************************************************
6/2006

Modified calculation of timestamp for detecting data file changes and validation of corresponding index files. Version 2.20 
and newer will fix older index headers for files on non-FAT formatted hard drives. For other drives (including many external 
USB or FireWire drives) the UpdateIndexChecksum.exe utility should be used to update the index file headers to prevent 
recreation of the index files.

7/19/2006

Fixed a problem with the hotspots that uses the path to the hotspot file if the target file cannot be located

Added labeling to POI and other data layers

Added support for ARC generate polygon and point formats

9/4/2006

*****Released version 2.20

10/18/2006

*****Released version 2.50...internal release

Lots of changes to the command line programs. Added Catalog program to help with QA/QC for new LIDAR acquisitions. 
Added GridMetrics to compute a variety of statistics for large point clouds. Enhanced PDQ data viewer to display DTM files 
and support drag-and-drop for .LDA, .LAS, and .DTM files.

11/16/2006
version 2.51

Changed logic in FUSION for detecting user activity and stopping a redraw. Problem arises when you have large POI or 
other data layers and you try to pan or zoom while the layer is being drawn. WM_PAINT message gets sent before drawing 
is stopped...eventually you get a stack fault or run out of graphics resources. This may also solve some problems observed 
when using a GPS unit linked to FUSION (not tested with the GPS).

Modified the image scaling logic to be more precise to prevent slight shifts while panning and zooming

Added logic to preserve scaling after a print preview or printing

Added keyboard support in FUSION for panning (arrow keys) and zoom (+-)

Added zoom control using mouse wheel (only available when measurement marker is off) use shift-wheel for fine control

Changed logic so that the graphics view in FUSION always has focus...this helps with panning and zooming behavior

Changed default symbol type for POI polygon files to "None"

Changed logic so display of raw data, POI, Hotspots, and Trees is turned off if underlying data for the
project is deleted (user removes data from the project)

2/26/2007

*****Released version 2.51...forsys website

4/4/2007
version 2.60

Modified DTM handling code to fix issues with hole filling, median filter and average filter. These functions
were using more memory than necessary.

Changed wording on the Edit...Copy menu item.

4/2007-7/2007

Lots of changes to command line tools. Added IntensityImage tool to create better images from intensity
data with contrast enhancement and automatic detection of the contrast range in the data. The resulting
images are much better than those produced using the ImageCreate tool or the Tools menu in FUSION. The
imporved logic will be incorporated into the old tools or will replace the old tools.

6/12/2007

Modified clipping logic for images in FUSION so a sample that is outside the image area does not cause
problems in LDV. Previous versions were creating an image that was a single pixel. LDV would give an
"Out of memory" error when trying to work with this image. Now no image is created when the sample area
is completely outside the image area in FUSION.

6/21/2007

Added the IntensityImage progam to create better images using intensity data.

6/29/2007

Increased the limit on the number of files that can be loaded into the raw data, poi, hotspots, and trees
dialog with each press of the "Add file" button. The limit is based on the total number of characters in
all the selected file names so the actual number of files that can be loaded varies depending on the length
of the file names. Also made the same change to the dialog used when combining several DTM files into a single
model.

7/20/2007

Fixed problem when loading a saved project that did not specify an image file. Previous version crashed.

Added ability to include specific returns in the data samples and changed sample options dialog to allow
user to select the returns to include. If user turns off all returns, FUSION will always say there are
no points within the sample area.

Changed behavior when a sample has no data points. Previous versions did not save the sample area so the
"Repeat last sample" button was disabled. Now the previous sample is saved and the button is not disabled.
This allows you to change the returns included in the sample and repeat the last sample even if there are
no data points in the sample.

8/1/2007

Modified FUSION to store temporary data files passed to LDV in the user's local TEMP space. In secure computing
environments, most users cannot write to the directory where FUSION is installed so FUSION cannot pass
a data sample to LDV. Version 2.60 writes the temporary data files to the user's local temp space and deletes
all the temp files when it exits. If you need to use the temporary files (tempdat.*), you will need to copy them
from your temp directory before exiting FUSION.

8/2/2007

Added File...Preferences dialog to provide access to FUSION options that had previously been available only
in the registry. Also provided access to the parameters used to read a GPS receiver connected to a serial port.
The COM port settings are stored a FUSION preferences and the coordinate system information is stored with a
FUSION project. The GPS link allows you to have a moving marker in FUSION's display to help with field
recconaisence. Support for GPS units is provided through COM ports only. If you have a GPS receiver that 
connects via USB, you will need drivers that redirect the USB data to a virtual COM port. Such drivers are
usually available from the GPS manufacturer.

8/7/2007

Added the GridSurfaceStats command line program. GridsurfaceStats computes the volume under and surface area 
of a canopy surface model. Surface area is reported as the computed surface area divided by the cell area.
The canopy surface area is being investigated as a measure of stand complexity.

8/16/2007

Added provision for "verbose" option to all command line utilities. Have not added verbose output to most utilities
but will do this as time permits. Verbose output will include an indicator to let the user know that the utility
is running (and not hung). Added short program descriptions to all command line utilities that print along with
syntax information. This is to help users remember the function of each progam.

10/17/2007

Added MergeDTM and DTM2ENVI command line programs. Modified the logic used in FUSION Tools...Terrain models...Combine...
menu to do a better job of checking available disk space and combine models faster.

10/23/2007

Changed behavior when exporting a DTM file to XYZ points. Previously, DTM cells with no data were not output. Now
all cells are output. Cells with no data have a value of -1.0.

Added validation of database field when using the /shape switch in PolyClipData. No validation was performed in
previous versions so the clipping process could fail without warning and after long processing times.

11/1/2007

Added message indicating that conversion was complete when converting generic ASCII data. Previous versions
indicated that the conversion was complete only when creating index files and didn't clear the progress bar.

************************************************************
*****Released version 2.60...forsys website...12/4/2007*****
************************************************************

12/5/2007 CSV2GRID V1.1
Modified CSV2Grid to provide the correct description and describe the need for and use of a header file.

12/6/2007 DTM2TIF V1.1
Modified DTM2TIF to remove description of /void in usage()...switch not used in DTM2TIF

12/12/2007 DTM2TIF V1.1
Modified DTM2TIF to included output of a text file with scaling information for the grayscale values

12/13/2007
Rebuilt FUSION as a DEBUG-enabled application. There are problems with the non-DEBUG version included in the
12/4/2007 release. Mostly in the sizing of dialogs.

*************************************************************
*****Released version 2.61...forsys website...12/13/2007*****
*************************************************************

1/4/2008 DTM2XYZ V1.1
Added /noheader switch to suppress header line in CSV ouput.

1/11/2008 XYZConvert (no version #)
Added support for Puget Sound LIDAR Consortium data from 2000 for the Tiger Mountain area in Washington State

1/15/2008 ASCIIImport V1.0
New program...converts ASCII text data files into FUSION's LDA format using a format definition file created
in FUSION's Data conversion...Import generic ASCII LIDAR data... dialog. This lets you interactively define the
correct format specifications and then use the command line tool to convert several files.

2/4/2008 LDV V1.45
Modified logic used for point markers to change their size and the camera focal length changes...goal is to 
keep the point marker about the same size as user zooms in/out.

2/5/2008 FUSION V2.62
Fixed a problem with canopy and ground models. For projects with both a ground and canopy mode, if you cleared 
the ground model, the canopy model was also cleared and sometimes you received an error when exiting FUSION.

2/14/2008 LDV V1.46
Fixed memory allocation error in individual tree segmentation code. Also fixed a problem when counting returns
that fall within each basin (segment). This code is not available to public users so this should not affect most 
users.

2/15/2008 IntensityImage V1.1
Rebuilt IntensityImage as a debug-enabled application. The image created by the non-debug version is incorrect.
It is generally a solid image using the void-area color.

2/22/2008 GridSample V1.0 & SurfaceSample V1.0
Added two new programs to sample values from DTM files. GridSample extracts cell values using a "grid" or
"raster" interpretation and SurfaceSample interpolates values using a "surface" interpretation. Both programs
read text files containing XY locations and output their results in CSV format.

2/29/2008 FUSION V2.63
Modified the Sample Options to allow the use of color classification rules whe coloring by pulse number.
Previous versions gave the appearance that this could be done but FUSION would not apply the rules.

3/3/2008 GridMetrics V1.8
Fixed problem when trying to process very large data sets...memory allocation problem with windows
was causing the program to crash before it could produce a meaningful error message. Problem seemed to
show up under windows XP and Vista but not Win2k. Added code to check amount of available memory before
to allocate memory for the point list. This fix doesn't increase the processing capability, it just provides
better error handling and gives a meaningful error message when there is not enough memeory to process
the metrics.

3/4/2008 Several programs
Fixed a problem with the code that reads ASCII data files. If the lines in the file were terminated with a
carriage return and a linefeed and the columns in the file were delimited with tabs, previous code caused
problems and would hang indefinitely. This fix should prevent further problems.

3/4/2008 SurfaceSample V1.1
Added support for a pattern of sample points. Options are for evenly spaced radial lines and equal-area radial
samples. Also added the noheader, novoid, and ID switches.

3/11/2008 FUSION V2.63
Added support for coloring return data using the classification code from LAS format files. Also modified
the overall logic used to create color legends for LDV when using color classification rules. Previous
version constructed a palette that did not use the color rules. This change results in no legend when
using the rules.

4/2/2008 GridMetrics V1.90
Added gridxy switch to allow user to specify the lower left and upper right corner of the area for which
statistics are computed. Previous version had the /grid switch that let the user specify the lower left
corner and the width and height

Also modified logic that computes the extent of the grid to work correctly when the upper right extent of 
the data is an EXACT multiple of the cell size (either the horizontal or vertical dimension). Previous 
versions produced output files filled with NODATA values. This change may result in output grids that have 
an extra row or column of NODATA values on the top or right edges. Problems in previous version occurred
most often when the grid cell size was specified with higher precision (more than 3 digits to the right 
of the decimal) than the horizontal position in the LIDAR point data.

4/2/2008 ClipData V1.70
Modified logic so index files are not created by ClipData. Previous version always created index files for 
every data file involved in a clip regardless of the /noindex switch. ClipData will still use index file
if they are present but it won't create them if they are not. Also added the /class switch to allow
specification of LAS classification codes for points included in the subsample. This makes it possible to
extract only points with specific classifications. For example, extracting bare-ground points from an all-
returns file.

4/2/2008 ClipDTM V1.00
New program to clip a .dtm file using a user specified extent. The actual clipped area will be rounded to 
the nearest grid point outside the specified extent.

4/10/2008 CanopyModel V1.3, Cover V1.4, DensityMetrics V1.1, GridSurfaceCreate V1.7, GroundFilter V1.4,
          IntensityImage V1.2, XYZ2DTM V
Modified the logic used to set the extent of the grid output to ensure that the grid covers all areas with
data points. Previous versions could have 1 too few columns or rows depending on the precision of the
grid cell size and the precision of the LIDAR data XY position.

5/8/2008 ClipData V1.80
Added /index switch to create index files for the data sample. Also modified the status ouput when an empty
sample file is generated and /zero switch is used.

5/13/2008 LDA2LAS V1.10
Corrected a problem with the total number of returns and the number of returns by return number reported
in the LAS file header when all returns in the source file were labeled as return 0. Total returns was
twice the actual number of returns and the number of returns by return number were all 0. This fix could also
affect other programs that create LAS data files (none of the other programs in the public release create
LAS files).

5/15/2008 FUSION V2.64 and LDV V1.46
Modified logic used for tree models to use a non-numeric label and read a color value for the tree crown
after the crown rotation. If the color value is omitted, the default crown color is used (white for
conifer-shaped trees and yellow for rounded-top trees). Color values are specified using individual red,
green, and blue components separated by commas. For example, 255,0,0 is red; 255,0,255 is magenta; and
128,64,0 is brown. Tree records with and without colors can be mixed in the same file.

6/5/2008 CanopyMaxima V1.2
Added the /res option to control the resampling for the intermediate surface grids. The default is to use
intermediate grids cell width and height 1/2 of the original (resampling by a factor of 2). Using a value
of 1.0 results in intermediate grids that are the same size as the original canopy model grid. Also modified
the logic so an image showing the loca maxima/minima is not automatically created. Use /img8 and /img24 to
create 8-bit or 24-bit color images showing maxima and minima.

6/9/2008 GridMetrics V2.1
Added /align:dtmfile switch to force alignment of output data to the origin and extent of the specified
PLANS format DTM file. This allows you to match the area described in the output from GridMetrics to the
area represented by a .dtm file.

*************************************************************
*****Released version 2.64...forsys website...6/12/2008******
*************************************************************

6/26/2008 GridMetrics V2.2
Modified logic used to figure out if extent from a .dtm file specified using the /align switch contained any
data. Previous version had trouble when the extent of the .dtm file completely contained the data extent. Result
was that GridMetrics reported that there were no data points within the .dtm file extent. The problem only 
occurred when the data files were indexed.

Also added more metrics so the GridMetrics outputs all the metrics reported by CloudMetrics.

Corrected a problem with the P05 and P95 raster outputs. They were the same values as the P10 and P90 raster
outputs.

6/26/2008 ClipData V1.9
Modified logic so point below DTM surface when using /dtm and /height are included in sample. Previous versions
removed points that were below the DTm surface. Users should specify /zmin:0 to duplicate old behavior. This change
was necessary to ensure that CloudMetrics and GridMetrics computed metrics that agreed. When ClipData removed the 
below-ground points, the metrics computed for a sample did not match the metrics computed for a cell.

6/30/2008 ClipData V2.0
Fixed logic problem when clipping specific returns from LAS files. Previous versions did not do this correctly.

7/24/2008 GridMetrics V2.3
Fixed the logic that caused the cell processing loop to exit early. The result was a .csv file that didn't have 
entries for all the cells in the coverage area.

8/5/2008 DensityMetrics V1.2
Fixed a problem that caused the lowest layer to have areas with relative densities greater than 100%. This only
occurred when the maximum slice height was an exact multiple of the slicethickness. The fix causes the correct
behavior...namely the output includes a slice that goes up to the maximum height as well as a slice that
includes everything above the maximum height. In addition, the problem with the first slice densities has been fixed.

8/5/2008 DTMHeader V1.1
Added button to scan the DTM file to determine the correct minimum and maximum data values. This lets you fix a model
with the incorrect mon/max values stored in its header.

8/5/2008 MergeDTM V1.1
Fixed problem when determining the min/max elevation values. Previous versions were using the min/max of all models
read instead of looking at the elevation written to the new model.

8/12/2008 All command line programs
Modified the logic used to print the command line into the log file and the command prompt window. Previous versions
would display the wrong command line when the executable was specified with a folder that contained spaces. For example,
"C:\Programs Files\FUSION\GridMetrics.exe" would produce an output that contained the following:
	Command line: GridMetrics Files\CFE\gridmetrics.exe

8/19/2008 LDA2ASCII no version number
Added new format that includes an identifier as the first column of the output. Otherwise format is the same as LTK CSV.
Also added optional parameter to suppress the column heading in the output file.

8/29/2008 GridSurfaceCreate V1.8
Added ability to use only points in LAS files with a given classification value. This is useful when the LAS file has 
been filtered to identify bare-earth points. Also changed logic used when filling in holes in the surface due to lack
of data points. New logic does not "smear" the areas with data to the edges of the data extent. This should help when 
creating surfaces using single data tiles and then pasting the surfaces together to form a single large surface model.

9/3/2008 Catalog V1.6
Modified logic when /bmp is specified to create copies of all images in BMP format. Previous version only produced a copy 
of the intensity image in BMP format.

9/15/2008 FilterData V1.0
Added FilterData program to facilitate removal of "outliers" in point files. The initial version creates a new file
containing all the returns that meet specific criteria. While this is not a particulary efficient techniques (most
returns will be included in the outout file), it gets the job done for projects where outliers were not removed by
the data provider.

9/30/2008 LDV V1.47
Fixed problem with the scaling logic when drawing small samples where the tree height was greater than the width and 
height of the sample. The scaling was only wrong when the X-dimension of the plot was greater than the Y-dimension
and the Z-dimension was greater than the X-dimension.

10/20/2008 Gridmetrics V2.4 
Fixed logic used to compute cover so that cover values are not computed when there aren't enough point in the cell 
to compute other metrics. Previous versions output cover value for the wrong cell when there were too few points.

11/4/2008 DTM2ASCII V1.2
Added CSV option to output data values in CSV format.

11/4/2008 CloudMetrics V1.7
Added /firstreturn switch to use only first returns to compute metrics. Previous versions used the /firstinpulse switch 
to identify the first return in a pulse which was not necessarily the first return due to tiled data deliveries and 
clipped data samples. The logic associated with the /firstreturn switch is much simplier and should result in consistent 
results no matter the processing steps used to produce a point cloud file.

11/12/2008 ClipData V2.1
Fixed problem parsing the DTM file name from the command line when it was enclosed in quotation marks. Previous versions 
failed without providing a reason for the faliure. Command lines that caused the problem looked like the following:

	clipdata ... /dtm:"ground.dtm" ...

11/13/2008 Catalog V1.7
Added /countreturns option to produce a count of the number of returns by return number in the CSV and HTML outputs. 
Runs of Catalog using this option can take longer than runs without because Catalog has to count up the number of 
returns by reading every point in each data file. In theory LAS files have the return counts in their header but 
TerraScan does not populate this information so it is necessary to read all the points. Also modified the information
displayed when producing image products to better indicate progress (added file # of # when scanning data files).

11/18/2008 CanopyModel V1.4
Changed the logic to use method for filling holes in grids (via PlansDTM class) to prevent data from being smeared 
to the edge of uneven data coverages.

11/20/2008 MergeDTM V1.20
Added /disk switch to force merging of the model to a disk file instead of trying to hold the model in memory. 
Turns out there are problems when trying to figure out if there is sufficient menmory to load the final model. 
I think there is enough memory to hold the model but not enough to complete the processing. The /disk option
allows you to circumvent the memory problem and force the model to be merged using a disk file.

Also added the /precision switch to let the user override the default precision for the elevations. The default
logic used the highest precision of the input models for the output. In general this approach makes sense but 
if using ASCII2DTM yo uend up with 8-byte double precision models when 4-byte float precision would suffice 
(and make the files 1/2 the size)

11/25/2008 ASCII2DTM V1.1 and CSV2Grid V1.2
Added /multiplier:# switch to help when converting cover estimates produced by GridMetrics into Arc compatible 
ASCII raster files and FUSION DTM files.

12/1/2008 FUSION V2.65
Modified logic used when LAS files (and other data formats) have no return number information (return number = 0).
This was causing problems where FUSION could not create a sample of data points even though the user was specifying
a valid sample area.

12/2/2008 FUSION 2.65 release ************************************************************************************

12/9/2008 GridSurfaceCreate V1.9
Corrected a problem with the logic used to fill holes in the final surface. Previous logic was leaving holes in 
the corners of the coverage area when the density of data points was low. New logic seems to eliminate the holes
so long as there are some data in the vicinity of a cell with no ground points.

12/16/2008 GridMetrics V2.5
Added buffer logic to help produce metrics over large data collections with no "seams". The buffer capability 
is best used in a batch processing mode where you can specify analysis tiles and use the list of all LIDAR data 
files in the acquisition. The logic will only use the returns within the analysis tile boundary (plus the buffer, if specified)
to compute metrics. Metrics are not output for cells within the buffer area.

1/9/2009 Catalog V1.8
Added the /rawcounts option to save grid of return (first and all) counts used to create density images. Only recognized 
when /density and/or /firstdensity are used. Grid is saved in PLANS DTM format. When /rawcounts is used, processing times
using indexed data files will be much greater as the data files must be read to count the returns. Using the /rawcounts
switch also adds detailed pulse and return density images to the HTML report. These images show the actual densities
rather that the density relative to the parameters provided with the /density and/or /firstdensity switches.

1/15/2009 GridMetrics V2.6
Added the ability to use multiple ground surface files when processing metrics. The groundfile parameter on the command
line can be a file specifier like *.dtm or the name of the text file containing a list of ground surface models. This
capability allows processing for large projects where the ground surface cannot be merged into single file. Also added the
ability to specify the analysis buffer as the number of grid cells. The 12/16/2008 modifications only allowed an buffer
specified as a distance. Also added the /minht switch to use returns above the specified height when computing metrics. 
Cover estimates still use all returns (usually first returns). Prior to this change, you could use the /outlier switch
to limit the returns used to compute the metrics but this resulted in bad cover estimates.

1/15/2009 MergeDTM V1.3
Fixed array subscript error used when setting the min/max elevation value for the combined surface model. This was causing
intermittant errors depending on the size and orientation of the combined extent.

1/16/2009 Several programs
Modified the logic used to allocate memory when loading .DTM files. Previous logic relied on default behavior when a memory
allocation failed. When memory gets low, the default behavior seems to be erratic and often fails causing a program crash.
The new logic tests the amount of available memory before attempting the allocation. The new logic seem more stable and reliable.

2/9/2009 MergeRaster V1.00
Added the MergeRaster program to merge ASCII raster files. This allows users to use ASCII raster format files for most outputs
and simplifies the process for importing area-wide coverages into ArcGIS. MergeRaster requires that grids being merged are aligned
to the same overall grid so special care may be needed to ensure that outputs from programs like GridMetrics are properly
aligned.

2/9/2009 GridMetrics V2.7
Added /acsii switch to change output format of files produced by /raster switch to be ASCII raster files. ASCII raster files
maintain negative values (.DTM files do not). The MergeRaster program can be used to merge several ASCII raster files into a 
single layer. Also corrected mislabeling of columns in CSV output files containing metrics. The labels for the total number 
of returns used to compute cover and the number of returns above the height cutoff were swapped. Column 4 contains the number 
of returns above the height cutoff and column 5 contains the total number of returns used for computing cover values.

************************************************************************************
3/3/2009 FUSION 2.70 release *******************************************************
************************************************************************************

FUSION 2.70 release
Important information regarding GridMetrics: If you have used GridMetrics with the /raster option to produce .DTM files containing
LIDAR-derived metrics, you should review the FUSION manual for important changes. Using .DTM files for output eliminates all
negative values in the metrics. For many allpications, this does not cause problems. However, a better method is to produce the
.CSV output containing all metrics and then use CSV2Grid to create ASCII raster files for the desired metrics. The resulting ASCII
raster files can be merged using the new MergeRaster program to produce large-area outputs for import into ArcGIS or other GIS
software. This method produces all metrics and maintains negative values.

