[ITK] ITK IO Plugin only loads after calling itk::ObjectFactoryBase::ReHash()
Bill Lorensen
bill.lorensen at gmail.com
Fri May 9 16:37:17 EDT 2014
There were other changes in that October 2012 patch. See here:
http://review.source.kitware.com/#/c/8102/
On Fri, May 9, 2014 at 4:35 PM, Bill Lorensen <bill.lorensen at gmail.com> wrote:
> If this test does not work on your version, you may need to upgrade to
> a newer ITK.
>
>
> On Fri, May 9, 2014 at 4:32 PM, Bill Lorensen <bill.lorensen at gmail.com> wrote:
>> I'm using the git HEAD, but ReHash was removed in October 2012. I've
>> attached the latest version.
>>
>>
>> On Fri, May 9, 2014 at 4:27 PM, Silvio Bauer <mail at silviobauer.de> wrote:
>>> Which ITK version are you running? My itkIOPluginTest.cxx looks like this
>>> (with ITK 4.2.1):
>>>
>>> /*=========================================================================
>>> *
>>> * Copyright Insight Software Consortium
>>> *
>>> * Licensed under the Apache License, Version 2.0 (the "License");
>>> * you may not use this file except in compliance with the License.
>>> * You may obtain a copy of the License at
>>> *
>>> * http://www.apache.org/licenses/LICENSE-2.0.txt
>>> *
>>> * Unless required by applicable law or agreed to in writing, software
>>> * distributed under the License is distributed on an "AS IS" BASIS,
>>> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>>> * See the License for the specific language governing permissions and
>>> * limitations under the License.
>>> *
>>>
>>> *=========================================================================*/
>>>
>>> #include "itkImageFileReader.h"
>>> #include "itkImageFileWriter.h"
>>>
>>> int itkIOPluginTest(int argc, char *argv[])
>>> {
>>> if (argc < 4)
>>> {
>>> std::cout << "Usage: " << argv[0] << " FactoryPath FileName Output" <<
>>> std::endl;
>>> return EXIT_FAILURE;
>>> }
>>>
>>> std::string myenv = std::string("ITK_AUTOLOAD_PATH=") +
>>> std::string(argv[1]) + std::string("/");
>>> #ifdef CMAKE_INTDIR
>>> myenv += std::string(CMAKE_INTDIR);
>>> #endif
>>> std::cout << myenv << std::endl;
>>> putenv (const_cast<char *>(myenv.c_str()));
>>> itk::ObjectFactoryBase::ReHash(); // <--- there it is
>>>
>>> // List all registered factories
>>> std::list<itk::ObjectFactoryBase *> factories =
>>> itk::ObjectFactoryBase::GetRegisteredFactories();
>>>
>>> std::cout << "----- Registered factories -----" << std::endl;
>>> if (factories.size() > 0)
>>> {
>>> for ( std::list<itk::ObjectFactoryBase*>::iterator
>>> f = factories.begin();
>>> f != factories.end(); ++f )
>>> {
>>> std::cout << " Factory version: "
>>> << (*f)->GetITKSourceVersion() << std::endl
>>> << " Factory description: "
>>> << (*f)->GetDescription() << std::endl;
>>>
>>> std::list<std::string> overrides = (*f)->GetClassOverrideNames();
>>> std::list<std::string> names = (*f)->GetClassOverrideWithNames();
>>> std::list<std::string> descriptions =
>>> (*f)->GetClassOverrideDescriptions();
>>> std::list<bool> enableflags = (*f)->GetEnableFlags();
>>> std::list<std::string>::const_iterator n = names.begin();
>>> std::list<std::string>::const_iterator d = descriptions.begin();
>>> std::list<bool>::const_iterator e = enableflags.begin();
>>> for ( std::list<std::string>::const_iterator o = overrides.begin();
>>> o != overrides.end(); ++o, ++n, ++d, e++ )
>>> {
>>> std::cout << " Override " << *o
>>> << " with " << *n << std::endl
>>> << " described as \"" << *d << "\"" << std::endl
>>> << " enabled " << *e << std::endl;
>>> }
>>> }
>>> std::cout << "----- -----" << std::endl;
>>> }
>>> else
>>> {
>>> std::cout << "Failed to load any factories" << std::endl;
>>> return EXIT_FAILURE;
>>> }
>>>
>>> typedef itk::Image<unsigned char,2> ImageNDType;
>>> typedef itk::ImageFileReader<ImageNDType> ReaderType;
>>> typedef itk::ImageFileWriter<ImageNDType> WriterType;
>>> ReaderType::Pointer reader = ReaderType::New();
>>> WriterType::Pointer writer = WriterType::New();
>>>
>>> int status = EXIT_SUCCESS;
>>> try
>>> {
>>> reader->SetFileName(argv[2]);
>>>
>>> writer->SetFileName(argv[3]);
>>> writer->SetInput(reader->GetOutput());
>>> writer->Update();
>>> reader->GetOutput()->Print(std::cout);
>>> }
>>> catch (itk::ExceptionObject &ex)
>>> {
>>> std::cout << "------------------ Caught unexpected exception!" <<
>>> std::endl;
>>> std::cout << ex;
>>> status = EXIT_FAILURE;
>>> }
>>>
>>> try
>>> {
>>> reader->SetFileName("foo");
>>> reader->Update();
>>> }
>>> catch (itk::ExceptionObject &ex)
>>> {
>>> std::cout << "------------------ Caught expected exception!" <<
>>> std::endl;
>>> std::cout << ex;
>>> status = EXIT_SUCCESS;
>>> }
>>>
>>> return status;
>>> }
>>>
>>>
>>>
>>>
>>> 2014-05-09 14:20 GMT-06:00 Bill Lorensen <bill.lorensen at gmail.com>:
>>>
>>>> Really, my copy does not have ReHash
>>>>
>>>> On Fri, May 9, 2014 at 3:29 PM, Silvio Bauer <mail at silviobauer.de> wrote:
>>>> > If you look at the source code itkIOPluginTest.cxx, it is actually
>>>> > calling
>>>> > ReHash() right at the beginning.
>>>> >
>>>> >
>>>> > 2014-05-09 13:06 GMT-06:00 Bill Lorensen <bill.lorensen at gmail.com>:
>>>> >
>>>> >> Try running this test:
>>>> >>
>>>> >> ITK/Modules/IO/ImageBase/test/itkIOPluginTest
>>>> >>
>>>> >> it works wihtout a rehash...
>>>> >>
>>>> >> On Fri, May 9, 2014 at 3:02 PM, Silvio Bauer <silvio.bauer01 at gmail.com>
>>>> >> wrote:
>>>> >> > Hi,
>>>> >> >
>>>> >> > I'm working on an IO plugin for ITK to read and write in-house image
>>>> >> > file
>>>> >> > formats. I did everything as described in the wiki here.
>>>> >> >
>>>> >> > I did everything by the book, put the dynamic library in the
>>>> >> > ITK_AUTOLOAD_PATH and set the ITK_AUTOLOAD_PATH environment variable.
>>>> >> >
>>>> >> > The library builds successfully, but when I try to read a file with
>>>> >> > the
>>>> >> > in-house format (with ImageReadExportVTK from the examples), I get
>>>> >> > this
>>>> >> > error message:
>>>> >> >
>>>> >> > ExceptionObject: Command not found.
>>>> >> >
>>>> >> > itk::ImageFileReaderException (0x7feab10f4eb8)
>>>> >> > Location: "virtual void itk::ImageFileReader<itk::Image<unsigned
>>>> >> > char,
>>>> >> > 3>,
>>>> >> > itk::DefaultConvertPixelTraits<unsigned char>
>>>> >> > >::GenerateOutputInformation()
>>>> >> > [TOutputImage = itk::Image<unsigned char, 3>, ConvertPixelTraits =
>>>> >> > itk::DefaultConvertPixelTraits<unsigned char>]"
>>>> >> > File: /people/seidel/ITK
>>>> >> >
>>>> >> >
>>>> >> > src/InsightToolkit-4.2.1/Modules/IO/ImageBase/include/itkImageFileReader.hxx
>>>> >> > Line: 143
>>>> >> > Description: Could not create IO object for file little.lat
>>>> >> >
>>>> >> > Tried to create one of the following:
>>>> >> >
>>>> >> > JPEGImageIO
>>>> >> > GDCMImageIO
>>>> >> > BMPImageIO
>>>> >> > LSMImageIO
>>>> >> > PNGImageIO
>>>> >> > TIFFImageIO
>>>> >> > VTKImageIO
>>>> >> > StimulateImageIO
>>>> >> > BioRadImageIO
>>>> >> > MetaImageIO
>>>> >> > NiftiImageIO
>>>> >> > NrrdImageIO
>>>> >> > GiplImageIO
>>>> >> > HDF5ImageIO
>>>> >> > You probably failed to set a file suffix, or
>>>> >> > set the suffix to an unsupported type
>>>> >> >
>>>> >> > However, if I put
>>>> >> >
>>>> >> > itk::ObjectFactoryBase::ReHash();
>>>> >> >
>>>> >> > before the reader is instantiated, everything works fine. But after
>>>> >> > that, no
>>>> >> > default factories are loaded. As I understand the plugin mechanism
>>>> >> > correctly, calling ReHash() shouldn't be necessary.
>>>> >> >
>>>> >> > Can anybody point me in the right direction?
>>>> >> >
>>>> >> > I'm on Mac OS 10.8.5 with ITK 4.2.1.
>>>> >> >
>>>> >> > Thanks in advance.
>>>> >> >
>>>> >> > -Silvio
>>>> >> >
>>>> >> >
>>>> >> > _______________________________________________
>>>> >> > Community mailing list
>>>> >> > Community at itk.org
>>>> >> > http://public.kitware.com/cgi-bin/mailman/listinfo/community
>>>> >> >
>>>> >>
>>>> >>
>>>> >>
>>>> >> --
>>>> >> Unpaid intern in BillsBasement at noware dot com
>>>> >
>>>> >
>>>>
>>>>
>>>>
>>>> --
>>>> Unpaid intern in BillsBasement at noware dot com
>>>
>>>
>>
>>
>>
>> --
>> Unpaid intern in BillsBasement at noware dot com
>
>
>
> --
> Unpaid intern in BillsBasement at noware dot com
--
Unpaid intern in BillsBasement at noware dot com
More information about the Community
mailing list