Hi  all Users & Developers,<div><br></div><div><br></div><div>I' m fresh user.  I'm begining my adventure with IGSTK...</div><div>I 'm  just working with example LandmarkRegistration1(Sandbox). </div><div>I  have to do  a DLL & wrapper  with this example.</div>
<div>I have already made  a method with this transformation but I have a problem with  <font class="Apple-style-span" color="#ff0000"><b>returned type</b>.</font></div><div>I want to return for example 1 element (point)  after transformation .</div>
<div>Could You help me please ?</div><div>I would  appreciate for any help .</div><div><br></div><div><br></div><div>Code : </div><div><br></div><div><div>extern "C"</div><div>{</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">    </span></div>
<div><b><font class="Apple-style-span" color="#ff0000">  __declspec(dllexport) double RegistrationDLL(double tab[30])</font></b></div><div><span class="Apple-tab-span" style="white-space:pre">        </span> {</div><div><br></div>
<div>igstk::RealTimeClock::Initialize();</div><div><br></div><div><br></div><div>// BeginCodeSnippet</div><div>  typedef igstk::Object::LoggerType             LoggerType;</div><div>  typedef itk::StdStreamLogOutput               LogOutputType;</div>
<div>    </div><div>  typedef igstk::Landmark3DRegistration</div><div>                            Landmark3DRegistrationType;</div><div>  typedef igstk::Landmark3DRegistration::LandmarkPointContainerType</div><div>                            LandmarkPointContainerType;</div>
<div>  typedef igstk::Landmark3DRegistration::LandmarkImagePointType </div><div>                            LandmarkImagePointType;</div><div>  typedef igstk::Landmark3DRegistration::LandmarkTrackerPointType</div><div>                            LandmarkTrackerPointType;</div>
<div>  typedef Landmark3DRegistrationType::TransformType::OutputVectorType </div><div>                            OutputVectorType;</div><div>  typedef igstk::Transform  TransformType;</div><div>// EndCodeSnippet</div><div>
<br></div><div><br></div><div>// BeginLatex</div><div>// </div><div>// Then, the registration component is instantiated as follows:</div><div>// </div><div>// EndLatex</div><div><br></div><div>// BeginCodeSnippet</div><div>
  Landmark3DRegistrationType::Pointer landmarkRegister = </div><div>                                        Landmark3DRegistrationType::New();</div><div>// EndCodeSnippet</div><div> </div><div><br></div><div>// BeginLatex</div>
<div>// </div><div>// Next, the landmark containers that hold the landmark image and tracker </div><div>// coordinates are instantiated:</div><div>//</div><div>// EndLatex</div><div><br></div><div>// BeginCodeSnippet</div>
<div>  LandmarkPointContainerType  imagePointContainer;</div><div>  LandmarkPointContainerType  trackerPointContainer;</div><div>// EndCodeSnippet</div><div><br></div><div><br></div><div>  LandmarkImagePointType      imagePoint;</div>
<div>  LandmarkTrackerPointType    trackerPoint;</div><div><br></div><div>// BeginLatex</div><div>// </div><div>// Then, error event callback objects are instantiated and added to the observer</div><div>// list of the registration component, as follows:</div>
<div>//</div><div>// EndLatex</div><div><br></div><div>// BeginCodeSnippet</div><div>  Landmark3DRegistrationInvalidRequestCallback::Pointer </div><div>                  lrcb = Landmark3DRegistrationInvalidRequestCallback::New();</div>
<div>    </div><div>  typedef igstk::InvalidRequestErrorEvent  InvalidRequestEvent;</div><div><br></div><div>  landmarkRegister->AddObserver( InvalidRequestEvent(), lrcb );</div><div><br></div><div>  Landmark3DRegistrationErrorCallback::Pointer ecb = </div>
<div>                  Landmark3DRegistrationErrorCallback::New();</div><div>  typedef igstk::Landmark3DRegistration::TransformComputationFailureEvent </div><div>                                                     ComputationFailureEvent;</div>
<div>  landmarkRegister->AddObserver( ComputationFailureEvent(), ecb );</div><div><br></div><div>// EndCodeSnippet</div><div><br></div><div>// BeginLatex</div><div>// </div><div>// A logger can then be connected to the registration component for </div>
<div>// debugging purpose, as follows:</div><div>//</div><div>// EndLatex</div><div><br></div><div><br></div><div>// BeginCodeSnippet </div><div>  LoggerType::Pointer   logger = LoggerType::New();</div><div>  LogOutputType::Pointer logOutput = LogOutputType::New();</div>
<div>  logOutput->SetStream( std::cout );</div><div>  logger->AddLogOutput( logOutput );</div><div>  logger->SetPriorityLevel( LoggerType::DEBUG );</div><div>  landmarkRegister->SetLogger( logger );</div><div>
// EndCodeSnippet</div><div>   </div><div><br></div><div>// BeginLatex</div><div>//</div><div>// Next, landmark points are added to the image and tracker containers.  The</div><div>// state machine of this registration component is designed so that the image</div>
<div>// and tracker coordinates that correspond to each landmark are added</div><div>// consecutively. This scheme prevents the mismatch in landmark correspondence</div><div>// that could occur when all landmarks image coordinates are recorded first and</div>
<div>// followed by the tracker coordinates.  This design choice is consistent with</div><div>// the ``safety by design'' philosophy of IGSTK. The commands are as follows:</div><div>//</div><div>//EndLatex </div><div>
<br></div><div>// BeginCodeSnippet</div><div>  // Add entry</div><div>  imagePoint[0] = tab[0];</div><div>  imagePoint[1] = tab[1];</div><div>  imagePoint[2] = tab[2];</div><div>  imagePointContainer.push_back(imagePoint);</div>
<div>  landmarkRegister->RequestAddImageLandmarkPoint(imagePoint);</div><div><br></div><div>  trackerPoint[0] = tab[3];</div><div>  trackerPoint[1] = tab[4];</div><div>  trackerPoint[2] = tab[5];</div><div>  trackerPointContainer.push_back(trackerPoint);</div>
<div>  landmarkRegister->RequestAddTrackerLandmarkPoint(trackerPoint);</div><div><br></div><div>  // Add 1st landmark</div><div>  imagePoint[0] = tab[6];</div><div>  imagePoint[1] = tab[7];</div><div>  imagePoint[2] = tab[8];</div>
<div>  imagePointContainer.push_back(imagePoint);</div><div>  landmarkRegister->RequestAddImageLandmarkPoint(imagePoint);</div><div>    </div><div>  trackerPoint[0] = tab[9];</div><div>  trackerPoint[1] = tab[10];</div>
<div>  trackerPoint[2] = tab[11];</div><div>  trackerPointContainer.push_back(trackerPoint);</div><div>  landmarkRegister->RequestAddTrackerLandmarkPoint(trackerPoint);</div><div><br></div><div>  // Add 2nd landmark</div>
<div>  imagePoint[0] = tab[12];</div><div>  imagePoint[1] = tab[13];</div><div>  imagePoint[2] = tab[14];</div><div>  imagePointContainer.push_back(imagePoint);</div><div>  landmarkRegister->RequestAddImageLandmarkPoint(imagePoint);</div>
<div><br></div><div>  trackerPoint[0] = tab[15];</div><div>  trackerPoint[1] = tab[16];</div><div>  trackerPoint[2] = tab[17];</div><div>  trackerPointContainer.push_back(trackerPoint);</div><div>  landmarkRegister->RequestAddTrackerLandmarkPoint(trackerPoint);</div>
<div><br></div><div>  // EndCodeSnippet</div><div><br></div><div>  // BeginLatex</div><div>  // </div><div>  // More landmarks can be added for the transform computation.  </div><div>  // </div><div>  // EndLatex</div><div>
<br></div><div>  // Add 3n landmark</div><div>  imagePoint[0] = tab[18];</div><div>  imagePoint[1] = tab[19];</div><div>  imagePoint[2] = tab[20];</div><div>  imagePointContainer.push_back(imagePoint);</div><div>  landmarkRegister->RequestAddImageLandmarkPoint(imagePoint);</div>
<div><br></div><div>  trackerPoint[0] = tab[21];</div><div>  trackerPoint[1] = tab[22];</div><div>  trackerPoint[2] = tab[23];</div><div>  trackerPointContainer.push_back(trackerPoint);</div><div>  landmarkRegister->RequestAddTrackerLandmarkPoint(trackerPoint);</div>
<div><br></div><div>  // Add target</div><div>  imagePoint[0] = tab[24];</div><div>  imagePoint[1] = tab[25];</div><div>  imagePoint[2] = tab[26];</div><div>  imagePointContainer.push_back(imagePoint);</div><div>  landmarkRegister->RequestAddImageLandmarkPoint(imagePoint);</div>
<div><br></div><div>  trackerPoint[0] = tab[27];</div><div>  trackerPoint[1] = tab[28];</div><div>  trackerPoint[2] = tab[29];</div><div>  trackerPointContainer.push_back(trackerPoint);</div><div>  landmarkRegister->RequestAddTrackerLandmarkPoint(trackerPoint);</div>
<div><br></div><div>  // BeginLatex</div><div>  // </div><div>  // After all landmark coordinates are added, the transform computation is </div><div>  // requested as follows:</div><div>  // </div><div>  // EndLatex</div>
<div><br></div><div>  // Calculate transform</div><div><br></div><div>  // BeginCodeSnippet</div><div>  landmarkRegister->RequestComputeTransform();</div><div>  // EndCodeSnippet</div><div>     </div><div>  typedef itk::VersorRigid3DTransform<double>        VersorRigid3DTransformType;</div>
<div>  typedef VersorRigid3DTransformType::ParametersType ParametersType;</div><div><br></div><div><br></div><div><br></div><div><br></div><div>  TransformType  transform;</div><div>  ParametersType     parameters(6);</div>
<div><br></div><div>  // BeginLatex</div><div>  // </div><div>  // To access the transform parameters, a GetTransform callback is instantiated</div><div>  // to observe the transform event, as follows: </div><div>  // </div>
<div>  // EndLatex</div><div><br></div><div>  // BeginCodeSnippet</div><div>  Landmark3DRegistrationGetTransformCallback::Pointer lrtcb =</div><div>    Landmark3DRegistrationGetTransformCallback::New();</div><div><br></div>
<div>  landmarkRegister->AddObserver( </div><div>    igstk::CoordinateSystemTransformToEvent(), lrtcb );</div><div>  //EndCodeSnippet</div><div><br></div><div><br></div><div>  // BeginLatex</div><div>  //</div><div>  // To request that the registration component throw an event loaded with </div>
<div>  // transform parameters, a \code{RequestGetTransform} function is invoked as </div><div>  // follows:</div><div>  // </div><div>  // EndLatex</div><div><br></div><div>  // BeginCodeSnippet</div><div>  landmarkRegister->RequestGetTransformFromTrackerToImage();</div>
<div>  std::cout<<"  "<<std::endl;</div><div> std::cout << "Transform " << transform << std::endl;</div><div><br></div><div>  // EndCodeSnippet</div><div><br></div><div><br>
</div><div><br></div><div><br></div><div><br></div><div><b><font class="Apple-style-span" color="#ff0000">  // return tab[4];  // ????? </font></b></div><div><b><font class="Apple-style-span" color="#ff0000"><br></font></b></div>
<div><b><font class="Apple-style-span" color="#ff0000">return  ... ?? </font></b></div><div>}</div><div><br></div><div>}</div></div><div><br></div><div>Best, </div><div>Agata </div><div><br></div><div><br></div><div><br></div>
<div><br></div><div><br></div><div><br></div>