From: Jonathan S. <jjs...@us...> - 2005-05-13 05:14:41
|
Update of /cvsroot/octaviz/octaviz/Scripts In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21581 Modified Files: vtk_axis.m Log Message: more axis improvements Index: vtk_axis.m =================================================================== RCS file: /cvsroot/octaviz/octaviz/Scripts/vtk_axis.m,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- vtk_axis.m 11 May 2005 05:11:49 -0000 1.9 +++ vtk_axis.m 13 May 2005 05:14:31 -0000 1.10 @@ -25,9 +25,8 @@ ## almost there... clipping now works on multiple actors, even keeping coloring correct ## to do: -## - "equal"/"normal" and "square" to work on multiple actors (easy to do) -## - force axes wider when wider limits are specified (i.e. not "tight") -## - add "tight" option +## - fix inconsistency where vtk_axis(square), then vtk_axis(limits) ends up with wrong axes +## - add "tight" option? ## - update help @@ -42,11 +41,14 @@ f.axes_on = 1; elseif ( strcmp(arg, "off") ) f.axes_on = 0; - - elseif ( strcmp(arg, "equal") || strcmp(arg, "normal") ) ## defaults in vtk - ## (working with just one Prop for now) + elseif ( strcmp(arg, "normal") ) ## defaults in vtk + vtk_axis("auto") + vtk_axis("equal") + elseif ( strcmp(arg, "equal") ) ## reset scaling - f.renderer.GetProps.GetLastProp.SetScale(1,1,1) + for i = 1:f.renderer.GetActors.GetNumberOfItems-1 # outline actor is i=0 + f.renderer.GetActors.GetItemAsObject(i).SetScale(1,1,1) + endfor f.axes.UseRangesOff elseif ( strcmp(arg, "square") ) vtk_axis("equal") # get to a known scale @@ -56,9 +58,9 @@ f.axes.UseRangesOn f.axes.SetRanges(dlims) ## scale the plot so that it is square - ## (working with just one Prop for now) - f.renderer.GetProps.GetLastProp.SetScale(1/span(1),1/span(2),1/span(3)) - + for i = 1:f.renderer.GetActors.GetNumberOfItems-1 + f.renderer.GetActors.GetItemAsObject(i).SetScale(1/span(1),1/span(2),1/span(3)) + endfor elseif ( strcmp(arg, "auto") ) ## reset axes bounds ## remove any clipping... how to do this elegently? ## this seems to be a hack, but it works; however, it may lead to a memory leak @@ -66,7 +68,7 @@ for i = 1:f.renderer.GetActors.GetNumberOfItems-1 # vtk counting starts at 0 actor = f.renderer.GetActors.GetItemAsObject(i); if (!actor.GetVisibility) - clipping = 1; # maybe add this as a structure to vtk_figure, so don't need to test here + clipping = 1; break endif endfor @@ -85,25 +87,46 @@ ++i; endwhile endif + else + printf("Option '%s' is not implemented;\n", arg) + disp("If you would like it to be, please contact the authors.") endif - else ## clip everything to desired axes limits - ## how to do this elegently? + else # force the specified axes limits + vtk_axis("auto") # return to original state + ## clip everything to desired axes limits; how to do this elegently? ## this seems to be a hack, but it works; however, it may lead to a memory leak limits = arg; - nactors = f.renderer.GetActors().GetNumberOfItems(); - for i = 1:nactors-1 # outline actor is i=0 + for i = 1:f.renderer.GetActors.GetNumberOfItems-1 clipmapper{i} = vtkPolyDataMapper; clipactor{i} = vtkActor; unclipactor = f.renderer.GetActors.GetItemAsObject(i); clipactor{i}.ShallowCopy(unclipactor); # copy actor properties (e.g. color) clipmapper{i}.ShallowCopy(unclipactor.GetMapper); # copy mapper properties (e.g. lookup table) - unclipactor.VisibilityOff; # turn unclipped actor off + unclipactor.VisibilityOff; # turn unclipped actor off clippd{i} = clipaxes(clipactor{i}.GetMapper.GetInput, limits); clipmapper{i}.SetInput(clippd{i}); clipactor{i}.SetMapper(clipmapper{i}); f.renderer.AddActor(clipactor{i}); endfor + ## add an actor that contains only corner points for the specified limits + ## this will force axes as wide as specified + cornerpoints = vtkPoints; + cornerpoly = vtkPolyData; + cornermapper = vtkPolyDataMapper; + corneractor = vtkActor; + limvals = reshape (limits,2,3)'; + for i = 1:2 + for j = 1:2 + for k = 1:2 + cornerpoints.InsertNextPoint(limvals(1,i),limvals(2,j),limvals(3,k)); + endfor + endfor + endfor + cornerpoly.SetPoints(cornerpoints); + cornermapper.SetInput(cornerpoly); + corneractor.SetMapper(cornermapper); + f.renderer.AddActor(corneractor); endif endfor @@ -165,3 +188,10 @@ ## to set arbitrary scaling ##f.renderer.GetProps.GetLastProp.SetScale(xscale,yscale,zscale) + + +## probably best option to implement "tight" is: +## - find current limits +## - vtk_axis("auto") +## - reduce, but do not expand, the limits from what they were (series of if statements) +## - vtk_axis(limits) |