W
Wallnusskaese
Neues Mitglied
Thread Starter
- Dabei seit
- 25.10.2013
- Beiträge
- 6
- Reaktionspunkte
- 1
Guten Tag allerseits,
ich würde euch gerne mein erstes Cocoa-Projekt vorstellen und brauche dabei Hilfe an diversen Ecken des Codes.
Aktuell besonders dabei, wie ich die angestoßenen Prozesse über die GUI wieder beenden kann.
Das Ziel: Entwicklung einer GUI für das Kommandozeilen-Tool Scanimage mittels Cocoa/Objective C.
seit ich mir für ein paar Euros einen HP-Scanjet 5550c geschossen habe, beschäftige ich mich mit der Frage, wie ich diesen am besten nutzbar machen kann. Da ich meinen Drucker im Netzwerk habe war mein Ziel, den Scanjet ebenso über das Netzwerk zu betreiben. Hierzu fiel meine Wahl auf das Sane-projekt (http://www.sane-project.org/). Mein Router (Asus RT-N16 mit Tomato firmware) fungiert hierbei als Sane-Server. Unter Windows funktioniert das Setup über xsane und selbst über Android funktioniert's mit Sanedroid. Nur mit OSX konnte ich nicht scannen, wie ich hier schon einmal ausgeführt hatte https://www.macuser.de/forum/thema/703783-TWAIN-SANE-Interface-Netzwerkscanner-Mavericks.
Wozu erzähle ich jetzt das Ganze noch mal? Ganz einfach, weil Scanimage der einzige Weg ist, von meinem Macbook zu scannen. Da dies auch wunderbar funktioniert, viele Funktionen bietet, aber halt alles andere als bedienungsfreundlich ist, habe ich beschlossen eine GUI dafür zu basteln.
(ich weiß es gibt Snac, das funktioniert aber mit meinem 5550c irgendwie nicht recht und kann darüber hinaus nicht über den ADF scannen.)
Aktueller Stand der Dinge:
Alles funktioniert auch soweit.
Funktionsweise:
Das Programm funktioniert derzeit so: Wird der Scan-button gedrückt, wird aus den eingegebenen Parametern ein String zusammengebaut, der quasi ein shellscript enthält.
1. Es werden im Format tiff so viele Seiten wie angegeben in einen temporären Ordner gescannt.
2. Die gescannten Seiten werden mit SIPS ins Zielformat konvertiert und ins Zielverzeichnis geschrieben.
3. Die temporären Dateien werden gelöscht.
Das Problem:
Das funktioniert, allerdings verliere ich damit die Kontrolle.
- Ist der Scan Vorgang gestartet, lässt er sich nicht unterbrechen.
Der Code:
Das passiert beim drücken des Scanbuttons:
Wie kann ich jetzt also das ganze abbrechen?
MfG,
Wk
ich würde euch gerne mein erstes Cocoa-Projekt vorstellen und brauche dabei Hilfe an diversen Ecken des Codes.
Aktuell besonders dabei, wie ich die angestoßenen Prozesse über die GUI wieder beenden kann.
Das Ziel: Entwicklung einer GUI für das Kommandozeilen-Tool Scanimage mittels Cocoa/Objective C.
seit ich mir für ein paar Euros einen HP-Scanjet 5550c geschossen habe, beschäftige ich mich mit der Frage, wie ich diesen am besten nutzbar machen kann. Da ich meinen Drucker im Netzwerk habe war mein Ziel, den Scanjet ebenso über das Netzwerk zu betreiben. Hierzu fiel meine Wahl auf das Sane-projekt (http://www.sane-project.org/). Mein Router (Asus RT-N16 mit Tomato firmware) fungiert hierbei als Sane-Server. Unter Windows funktioniert das Setup über xsane und selbst über Android funktioniert's mit Sanedroid. Nur mit OSX konnte ich nicht scannen, wie ich hier schon einmal ausgeführt hatte https://www.macuser.de/forum/thema/703783-TWAIN-SANE-Interface-Netzwerkscanner-Mavericks.
Wozu erzähle ich jetzt das Ganze noch mal? Ganz einfach, weil Scanimage der einzige Weg ist, von meinem Macbook zu scannen. Da dies auch wunderbar funktioniert, viele Funktionen bietet, aber halt alles andere als bedienungsfreundlich ist, habe ich beschlossen eine GUI dafür zu basteln.
(ich weiß es gibt Snac, das funktioniert aber mit meinem 5550c irgendwie nicht recht und kann darüber hinaus nicht über den ADF scannen.)
Aktueller Stand der Dinge:
Alles funktioniert auch soweit.
Funktionsweise:
Das Programm funktioniert derzeit so: Wird der Scan-button gedrückt, wird aus den eingegebenen Parametern ein String zusammengebaut, der quasi ein shellscript enthält.
1. Es werden im Format tiff so viele Seiten wie angegeben in einen temporären Ordner gescannt.
2. Die gescannten Seiten werden mit SIPS ins Zielformat konvertiert und ins Zielverzeichnis geschrieben.
3. Die temporären Dateien werden gelöscht.
Das Problem:
Das funktioniert, allerdings verliere ich damit die Kontrolle.
- Ist der Scan Vorgang gestartet, lässt er sich nicht unterbrechen.
Der Code:
Das passiert beim drücken des Scanbuttons:
Code:
- (IBAction)bScan:(id)sender {
//Benötigte Vars
NSString *tempdir =@"/tmp/";
NSString *name =@"";
NSString *pathtoscanimage =@"/usr/local/bin/scanimage ";
NSString *format =@""; //=@"tiff ";
NSString *devname =@"";
NSString *batch =@""; //=[@"--batch " stringByAppendingString:out];
NSString *batchstart =@""; //=@"--batch-start=1 ";
NSString *batchcount =@""; //=@"--batch-count=1 ";
NSString *batchincrement =@""; //=@"--batch-increment=1 ";
NSString *saveto =@"";
//Device Specific
NSString *mode =@""; //=@"--mode Lineart "; // Color/Gray/Lineart
NSString *source =@""; //=@"--source Flatbed "; //ADF
NSString *resolution =@""; //=@"--resolution 100 ";
// NSString *preview =@""; //=@"--preview ";
NSString *scantemp =@"";
NSString *converttemp =@"";
NSString *deltemp =@"";
NSString *scantotal =@"";
//Einstellungen abfragen
mode= [self getMode];
format=[self getFormat];
resolution=[self getDPI];
source=[self getSource];
saveto=[self.tfsaveto stringValue];
name=[self.tfName stringValue];
batchcount=[self.tfBatchCount stringValue];
batchstart=[self.tfBatchStart stringValue];
batchincrement=[self.tfBatchIncrement stringValue];
//Batch-(teil)String zusammenbauen
batch = [NSString stringWithFormat:@"%@%@%@%@%@%@%@", @"--batch --batch-start=",batchstart,@" --batch-count=",batchcount,@" --batch-increment=",batchincrement,@" "];
//Scanstring in den temporäten Ordner zusammenbauen
scantemp = [NSString stringWithFormat:@"%@%@%@%@%@%@%@", pathtoscanimage, @"--format=tiff ",devname,batch,mode,source,resolution];
//Teilstring für Konvertierung in Zielordner + löschen aus temp-Ordner zusammenbauen
int n = batchcount.intValue;
int j = batchstart.intValue;
int incr = batchincrement.intValue;
int number = 0;
NSString *nn=@"";
//In jedem Durchlauf wird der Befehl zum Konvertieren und löschen einer Datei an den nn-String angehangen.
for (int i=1; i<=n; i++) {
if (i==1) { //wenn i==1 --> erster Durchlauf Nummerierung startet be "batchstart"
number=j;
} else { //sonst bei "batchstart"+("Durchlauf"-1)*"increment"
number = (i-1)*incr+j;
}
//Konvertierungsbefehl für aktuelles i zusammenbauen || Konvertierung mittels SIPS
converttemp = [NSString stringWithFormat:@"%@%@%@%@%@%d%@%@%@%@%d%@%@%@",@" ; sips -s format ",format, @" '", tempdir, @"out",number,@".tif' --out '",saveto,@"/",name,number,@".",format,@"'"];
//löschstring für aktuelles i zusammenbauen
deltemp =[NSString stringWithFormat:@"%@%@%@%d%@",@" ; rm '",tempdir,@"out",number,@".tif'"];
//i. Konvertier- und löschstring an nn anhängen.
nn=[NSString stringWithFormat:@"%@%@%@",nn,converttemp,deltemp];
}
//Finalen Befehlsstring zusammenbauen
scantotal = [NSString stringWithFormat:@"%@%@",scantemp,nn];
//Den nächsten Scan bei start+batch starten
[self.tfBatchStart setStringValue:[NSString stringWithFormat:@"%d",number+1]];
//debug
NSLog([ NSString stringWithFormat:@"%@%@%@",@"Scantotal Debug String: ",scantotal,@" Output des NSTask:"]);
//Task ausführen
NSTask *task =[[NSTask alloc] init];
[task setLaunchPath:@"/bin/sh"];
[task setCurrentDirectoryPath:tempdir];
[task setArguments:@[@"-c",scantotal,@"nil"]];
[task launch];
//einstellungen speichern
[self setIntForKey:self.scDPI.selectedSegment :@"DPI"];
[self setIntForKey:self.scFormat.selectedSegment :@"Format"];
[self setIntForKey:self.scScanmode.selectedSegment :@"Scanmode"];
[self setIntForKey:self.scSource.selectedSegment :@"Source"];
[self setStringForKey:self.tfBatchCount.stringValue :@"BatchCount"];
[self setStringForKey:self.tfBatchIncrement.stringValue :@"BatchIncrement"];
[self setStringForKey:self.tfBatchStart.stringValue :@"BatchStart"];
[self setStringForKey:self.tfName.stringValue :@"Name"];
[self setStringForKey:self.tfsaveto.stringValue :@"SaveTo"];
}
Wie kann ich jetzt also das ganze abbrechen?
MfG,
Wk