Développement de plugins sous Osirix

TopCao

Membre confirmé
29 Décembre 2010
14
0
Salut à tous,
Je débute ce topic en introduisant que je ne suis pas programmeur ni même informaticien, que je maitrise assez bien MatLab, mais que l'objectiv-C est encore assez obscure pour moi.
Je travaille dans le domaine de l'imagerie médicale et je souhaiterai développer un plugin pour le logiciel gratuit Osirix. Il ne fonctionne que sur Mac, du coup je programme sous Xcode en objectiv-C.

L'object de mon travail est d'arriver à programmer un plugin capable de travailler sur des images en 4 dimensions. Globalement, tous les outils d'affichage sont déja inclus dans Osirix, il ne me "reste" donc plus qu'à apprendre à gérer les données dynamiques, ce que je fais depuis longtemps sur MatLab.
Osirix est relativement bien fait puisqu'il propose un générateur de plugin, qui crée les fichier .h et .m, je n'ai plus qu'a écrire le coeur du code.
Pour commencer, je souhaiterai, à partir de données 4D de la forme imageDyn(x,y,z,t) créer des fonctions simples du type [intégrale des valeurs] et retourner une image paramétrique imageParam(x,y,z)
Bloc de code:
//
//  TopCaoFilter.m
//  TopCao
//
//  Copyright (c) 2010 Alexandre. All rights reserved.
//
#import "TopCaoFilter.h"
@implementation TopCaoFilter
- (void) initPlugin
{
}
- (long) filterImage:(NSString*) menuName
{
 NSWindowController *window = [[NSWindowController alloc] initWithWindowNibName:@"Control_Panel" owner:self];
 [window showWindow:self]; // This will bring up the window
 return 0; // No errors
}
// COMPUTE ADC
- (IBAction) computeADC:(id)sender;
{
 NSLog(@"computeADC!!!");
 
 id waitWindow = [viewerController startWaitWindow:@"Computing ADC !"];
 // New window
 ViewerController *new2DViewer;
 // Duplicate the current window
 new2DViewer = [self duplicateCurrent2DViewerWindow];
 
 NSString* message ;    // Declare message for window
 int  i, x, zSize;   // Declare variables
 float *fImage, *fImageNew; // Declare images
 NSArray *pixList, *pixListNew; // 4D
 DCMPix *curPix, *curPixNew; // 2D
 
 pixList  = [viewerController pixList];
 pixListNew = [new2DViewer pixList];
 zSize  = [pixList count];
 
 
 message = @"zSize"; //@"Define this message in the Hello World plugin's preferences";
 for (i = 0; i < zSize; i++)
 {
  curPix  = [pixList  objectAtIndex:i];
  curPixNew = [pixListNew objectAtIndex:i];
 
  // fImage is a pointer on the pixels, ALWAYS represented in float
  fImage  = [curPix  fImage];
  fImageNew = [curPixNew fImage];
  x   = [curPixNew pheight] * [curPixNew pwidth];
 
  while (x-- > 0) {
   if (*fImage < 128) {
    *fImageNew = 0;
   }
   else{
    *fImageNew = *fImage;
 
   }
 
   fImage++;
   fImageNew++;
  }
 }
 
 [viewerController endWaitWindow: waitWindow];
 
 
 // Apply clut & full dynamic range & refresh window
 [new2DViewer ApplyCLUTString: @"Rainbow"];
 [[new2DViewer imageView] setWLWW:0 :0];
 [new2DViewer needsDisplayUpdate];
 
 NSAlert *myAlert = [NSAlert alertWithMessageText:@"Control value text box"
            defaultButton:@"OK"
          alternateButton:nil
           otherButton:nil
         informativeTextWithFormat:@"%@", message];
 
 [myAlert runModal];
}
- (IBAction) closePlugin:(id)sender;
 {
 
  [myWindow close];
 }
@end
Voici ce que je suis arrivé à programmer en prenant des bouts de code par ci par là. Ma fonction computeADC, appelée par le bouton du même nom me permet d'appliquer un seuillage à la valeur de signal 128.
Au dessus de cette valeur, l'image reste la même.
Le processus s'applique à tous les images.
Voilà, j'espère vous avoir donné assez d'explications et que vous pourrez me donner un petit coup de main.
A bientôt
Alex
 
je no connais ton appli mais je vois nullepart l'application des nouvelles valeures

tu get "les infos actuelles" tweak tes pixels mais tu ne set jamais tes changements au controller tu lui dis juste de repeindre