[ITK] ITK IO Plugin only loads after calling itk::ObjectFactoryBase::ReHash()

Silvio Bauer silvio.bauer01 at gmail.com
Fri May 9 16:47:56 EDT 2014


Thank you very much, Bill! I think this is the problem. I looked at the
Diff of itkObjectFactoryBase.cxx, and the changes are exactly what I
thought should be changed in order to load the dynamic libraries on reader
instantiation. I think the if statement

if ( !ObjectFactoryBasePrivate::m_RegisteredFactories )

is never true, so Initialize() and therefore LoadDynamicFactories() is
never called.

So I guess I have to get our admin to update to the newest ITK version.

Thanks again and have a nice weekend
-Silvio


2014-05-09 14:37 GMT-06:00 Bill Lorensen <bill.lorensen at gmail.com>:

> 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
> _______________________________________________
> Community mailing list
> Community at itk.org
> http://public.kitware.com/cgi-bin/mailman/listinfo/community
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/community/attachments/20140509/2a05683f/attachment-0002.html>


More information about the Community mailing list