|
Notes |
|
|
(0010321)
|
|
Xenophon Papademetris
|
|
2008-01-28 23:52
|
|
This is a critical bug for us at BioImage Suite (www.bioimagesuite.org) where ShallowCopy is used multiple times. The problem is naturally most acute within the Registration pipeline where image spacing and origin change frequently ....
A potential solution is below, it was also posted on vtk-developers
Feel free to contact me directly if you need more information, scripts to replicate this etc.
//--------------------------------------------------------------------------
--
// This copies all the local variables (but not objects).
void vtkImageData::InternalImageDataCopy(vtkImageData *src)
{
int idx;
this->DataDescription = src->DataDescription;
this->SetScalarType(src->GetScalarType());
this->SetNumberOfScalarComponents(src->GetNumberOfScalarComponents());
for (idx = 0; idx < 3; ++idx)
{
this->Dimensions[idx] = src->Dimensions[idx];
this->Increments[idx] = src->Increments[idx];
this->Origin[idx] = src->Origin[idx];
this->Spacing[idx] = src->Spacing[idx];
}
memcpy(this->Extent, src->GetExtent(), 6*sizeof(int));
// Additions (XP)
if (this->Information->Has(SPACING()))
this->Information->Set(SPACING(),this->Spacing[0],this->Spacing[1],this->Spa
cing[2]);
if (this->PipelineInformation->Has(SPACING()))
this->PipelineInformation->Set(SPACING(),this->Spacing[0],this->Spacing[1],t
his->Spacing[2]);
if (this->Information->Has(ORIGIN()))
this->Information->Set(ORIGIN(),this->Origin[0],this->Origin[1],this->Origin
[2]);
if (this->PipelineInformation->Has(ORIGIN()))
this->PipelineInformation->Set(ORIGIN(),this->Origin[0],this->Origin[1],this
->Origin[2]);
// End of Additions |
|
|
|
(0019985)
|
|
David Partyka
|
|
2010-03-23 11:10
|
|
An alternative patch from Dominique Belhachemi <domibel@cs.tu-berlin.de>.
Index: Filtering/vtkTrivialProducer.cxx
===================================================================
RCS file: /cvsroot/VTK/VTK/Filtering/vtkTrivialProducer.cxx,v
retrieving revision 1.13
diff -u -r1.13 vtkTrivialProducer.cxx
--- Filtering/vtkTrivialProducer.cxx 18 Dec 2008 16:55:39 -0000 1.13
+++ Filtering/vtkTrivialProducer.cxx 17 Mar 2010 15:36:21 -0000
@@ -20,6 +20,7 @@
#include "vtkInformation.h"
#include "vtkInformationVector.h"
#include "vtkObjectFactory.h"
+#include "vtkDataObject.h"
vtkCxxRevisionMacro(vtkTrivialProducer, "$Revision: 1.13 $");
vtkStandardNewMacro(vtkTrivialProducer);
@@ -115,6 +116,27 @@
vtkInformationVector** inputVector,
vtkInformationVector* outputVector)
{
+ if (this->Output->IsA("vtkImageData"))
+ {
+ vtkImageData* img=(vtkImageData*)(this->Output);
+
+ vtkInformation* info = img->GetInformation();
+ vtkInformation* pinfo = img->GetPipelineInformation();
+ double Spacing[3]; img->GetSpacing(Spacing);
+ double Origin[3]; img->GetOrigin(Origin);
+
+ if (info->Has(vtkDataObject::SPACING()))
+ info->Set(vtkDataObject::SPACING(),Spacing[0],Spacing[1],Spacing[2]);
+
+ if (pinfo->Has(vtkDataObject::SPACING()))
+ pinfo->Set(vtkDataObject::SPACING(),Spacing[0],Spacing[1],Spacing[2]);
+
+ if (info->Has(vtkDataObject::ORIGIN()))
+ info->Set(vtkDataObject::ORIGIN(),Origin[0],Origin[1],Origin[2]);
+
+ if (pinfo->Has(vtkDataObject::ORIGIN()))
+ pinfo->Set(vtkDataObject::ORIGIN(),Origin[0],Origin[1],Origin[2]);
+ }
if(request->Has(vtkDemandDrivenPipeline::REQUEST_INFORMATION()) &&
this->Output)
{ |
|
|
|
(0019987)
|
|
David Partyka
|
|
2010-03-23 15:55
|
|
Fix by the following patch from Berk:
diff --git a/VTK/Filtering/vtkTrivialProducer.cxx b/VTK/Filtering/vtkTrivialProducer.cxx
index 10c20bf..80881bb 100644
--- a/VTK/Filtering/vtkTrivialProducer.cxx
+++ b/VTK/Filtering/vtkTrivialProducer.cxx
@@ -20,6 +20,7 @@
#include "vtkInformation.h"
#include "vtkInformationVector.h"
#include "vtkObjectFactory.h"
+#include "vtkDataObject.h"
vtkCxxRevisionMacro(vtkTrivialProducer, "$Revision$");
vtkStandardNewMacro(vtkTrivialProducer);
@@ -148,6 +149,20 @@ vtkTrivialProducer::ProcessRequest(vtkInformation* request,
outputInfo->Set(vtkStreamingDemandDrivenPipeline::TIME_STEPS(),
timeRange, 2);
}
+
+ if (this->Output->IsA("vtkImageData"))
+ {
+ vtkImageData* img = static_cast<vtkImageData*>(this->Output);
+ vtkInformation* pinfo = img->GetPipelineInformation();
+
+ double spacing[3];
+ img->GetSpacing(spacing);
+ pinfo->Set(vtkDataObject::SPACING(), spacing[0], spacing[1], spacing[2]);
+
+ double origin[3];
+ img->GetOrigin(origin);
+ pinfo->Set(vtkDataObject::ORIGIN(), origin[0], origin[1], origin[2]);
+ }
}
#if VTK_TRIVIAL_PRODUCER_CHECK_UPDATE_EXTENT
if(request->Has(vtkStreamingDemandDrivenPipeline::REQUEST_UPDATE_EXTENT()))
Committed:
Committer: Dave Partyka <dave.partyka@kitware.com>
/cvsroot/ParaView3/ParaView3/VTK/Filtering/vtkTrivialProducer.cxx,v <-- Filtering/vtkTrivialProducer.cxx
new revision: 1.14; previous revision: 1.13 |
|