Dateiersetzen bestätigen (Dialog)

Hilfe zu verschiedenen Themen
Benutzeravatar
tbone
Supporter
Beiträge: 440
Registriert: 29. Okt 2021 00:45
Betriebssystem: Windows 10 Pro

Re: Dateiersetzen bestätigen (Dialog)

Beitrag von tbone »

Beyond Compare habe ich auch mal gestartet.. sieht auch sehr brauchbar aus. Eine DO Integration scheint ein bisschen schwierig, aber wäre als separate Lösung oder Ergänzung u.U. auch eine Option.

Es kann Text und Bilder und andere Sachen vergleichen, kann aber nach extern leider kein "Keep/Replace" geben, man muss dazu wohl den Folder-Compare benutzten, der rappelt dann alle Dateien selbst durch und stellt die Unterschiede da. Bei Konflikten kann man dann den Compare-View öffnen, sich entscheiden und danach bspw. ein Move-Left, Move-Right machen um die jeweiligen Dateien zu überschreiben oder nicht.

Mächtiges Tool.. ist hier vielleicht nicht richtig, aber so grundsätzlich sind das ja Probleme, die irgendwie bereits schonmal gelöst wurden! o)
image.png
image.png
Benutzeravatar
tbone
Supporter
Beiträge: 440
Registriert: 29. Okt 2021 00:45
Betriebssystem: Windows 10 Pro

Re: Dateiersetzen bestätigen (Dialog)

Beitrag von tbone »

Ich habe im Moment keine Idee, wie ich da den Dialog zum laufen bekomme. Sonst wäre das für Mazze vielleicht ein gangbarer Weg.
Es ist leider nicht beschrieben wie das direkt mittels Script möglich wäre, aber wenn Dein Command Parameter annimmt, anstatt sich selbst Dateien aus Src/Dst herauszupicken, könnte es klappen.
Benutzeravatar
Kundal
Moderator
Beiträge: 135
Registriert: 24. Okt 2021 18:02
Betriebssystem: Windows 10 Pro

Re: Dateiersetzen bestätigen (Dialog)

Beitrag von Kundal »

Ja, da liegt das Problem. clickData.Func.sourcetab.selected(0) funktioniert da nicht. Ich weiß nicht, wie ich die Dateien adressieren kann. Mit den DOpus-internen Befehlen bekomme ich den Dialog teilweise zum laufen. Allerdings funktioniert das Kopieren der temporären Dateien erst, wenn ich im Ersetzen-Dialog die Datei Überspringe, weil der Ersetzen-Dialog die Datei sperrt. Ein Problem entsteht dann, wenn ich die temporären Dateien in meinen Dialog lade. Da muss ich dann im Skript als Dateiendung z.B. .jpg angeben, weil ich die Endung nicht auslesen kann. Mit {file|ext} komme ich da nicht weiter.
Der Vorgang ist aber etwas umständlich. Im Ersetzen-Dialog per Kontextmenü den Befehl CompareImages klicken, dann auf Überspringen klicken und erst dann öffnet sich der Dialog.

Code: Alles auswählen

// CompareImages
// (c) 2024 Kundal
// This is a script for Directory Opus.
// See https://www.gpsoft.com.au/endpoints/redirect.php?page=scripts for development information.

// Called by Directory Opus to initialize the script
function OnInit(initData)
{	
	initData.name = "CompareImages";
	initData.desc = "Zeigt eine in der Quelle ausgewählte Bilddatei gemeinsam mit der Datei gleichen " +
		"Namens im Ziel in einem Dialogfenster und bietet die Option, die Zieldatei mit der Quelldatei zu überschreiben.";
	initData.version = "1.0";
	initData.copyright = "(c) 2024 Kundal";
	initData.default_enable = true;
	initData.min_version = "13.0";
	var cmd = initData.AddCommand;
	cmd.name = "CompareImages";
	cmd.method = "OnCompareImages";
	cmd.label = "CompareImages";
}

// Funktion CompareImages
function OnCompareImages(clickData)
{

    var dlg = clickData.Func.Dlg;
	var cmd = DOpus.Create.Command;
	 
// Temporäre skalierte Kopien erzeugen.
	cmd.AddLine("Copy TO /temp AS One{file|ext}");
	cmd.AddLine("Copy {d}\{file|nopath} TO /temp AS Two{file|ext}");
	cmd.Run;
	cmd.RunCommand("Image CONVERT FROM /temp\\One{file|ext} HEIGHT=1024 PRESERVEASPECTRATIO HERE REPLACE=always");
	cmd.RunCommand("Image CONVERT FROM /temp\\Two{file|ext} HEIGHT=1024 PRESERVEASPECTRATIO HERE REPLACE=always");

// Hauptdialog
	dlg.template = "dialog1";
    dlg.position = "parent";
    dlg.Create;
    dlg.Control("Bild1").label = DOpus.Loadimage("/temp\\One.jpg");	
    dlg.Control("Bild2").label = DOpus.Loadimage("/temp\\Two.jpg");
//	dlg.Control("Dateiname").label = filename + "   " + SourceImage.Metadata.Image.picheight +"x"+ SourceImage.Metadata.Image.picwidth + " px";
	dlg.RunDlg;

	if (dlg.result == 1){
    	cmd.RunCommand("Copy TO {d} WHENEXISTS=replace");
		cmd.RunCommand("Delete /temp\\(One|Two){file|ext} Quiet");
		return;
		}
	if (dlg.result == 0)
		cmd.RunCommand("Delete /temp\\(One|Two){file|ext} Quiet");
		return;
}
==SCRIPT RESOURCES
<resources>
	<resource name="dialog1" type="dialog">
		<dialog fontsize="10" height="196" lang="deutsch" standard_buttons="cancel" title="Texturen ersetzen" width="402">
			<control halign="left" height="155" image="yes" name="Bild1" title="Bild1" type="static" valign="top" width="185" x="10" y="10" />
			<control halign="left" height="155" image="yes" name="Bild2" title="Bild2" type="static" valign="top" width="185" x="210" y="10" />
			<control close="1" default="yes" height="14" name="Ersetzen" title="Ersetzen" type="button" width="50" x="293" y="178" />
			<control height="170" name="group1" title="Quelle" type="group" width="197" x="4" y="1" />
			<control height="170" name="group2" title="Ziel" type="group" width="193" x="206" y="1" />
			<control halign="left" height="11" name="Dateiname" type="static" valign="center" width="254" x="6" y="175" />
		</dialog>
	</resource>
</resources>
Benutzeravatar
Kundal
Moderator
Beiträge: 135
Registriert: 24. Okt 2021 18:02
Betriebssystem: Windows 10 Pro

Re: Dateiersetzen bestätigen (Dialog)

Beitrag von Kundal »

Für die Dateiendung habe ich zwar einen Workaround per Clipboard COPYNAMES und DOpus.GetClip gefunden, aber das Ganze funktioniert auch nur für eine einzelne Datei. Bei mehreren zu kopierenden Dateien poppt nach Überspringen einer Datei gleich der nächste Standard-Ersetzen-Dialog auf und mein Dialog (und dazwischen auch noch der Bildkonvertierungs-Dialog) kommt erst nach dem Ende des Kopiervorgangs. Dieser Weg scheint mir also unbrauchbar zu sein, weil man mit meinem Dialog nicht in den laufenden Kopiervorgang eingreifen kann.
Bleibt für meinen Lösungsweg nur die oben beschriebene Möglichkeit, erst die gleichnamigen Dateien zu bearbeiten und dann den Rest zu kopieren.
Benutzeravatar
tbone
Supporter
Beiträge: 440
Registriert: 29. Okt 2021 00:45
Betriebssystem: Windows 10 Pro

Re: Dateiersetzen bestätigen (Dialog)

Beitrag von tbone »

Arg.. immer dieses 1000 Sachen gleichzeitig machen und 999 davon haben gar keine Prio! o)

So eintragen..
image.png
image.png (37.03 KiB) 5635 mal betrachtet

So aufrufen (IMMER AUF DEM UNTEREN THUMBNAIL!), sonst geht der "Replace" rückwärts!
image.png
image.png (19.46 KiB) 5635 mal betrachtet

ImageCompare v1.1 - Parameter Handling hinzugefügt und mit dem "Selection-Mode" kombiniert (geht nach wie vor).
CompareImages.js.txt
(5.02 KiB) 245-mal heruntergeladen
Ich fang' meine Prototypen-Programme ja immer bei v0.1 an oder besser v0.0.1.. o)
Benutzeravatar
tbone
Supporter
Beiträge: 440
Registriert: 29. Okt 2021 00:45
Betriebssystem: Windows 10 Pro

Re: Dateiersetzen bestätigen (Dialog)

Beitrag von tbone »

Was Du für Probleme mit tmpFile bzw. File-Extension hattest.. habe ich a) nicht wirklich verstanden und b) in dem Code auch irgendwas umgebaut, dass er die Dateien vorher nicht erst kopiert, sondern gleich mit ImageConvert nach /temp anlegt.

Warum muss man die überhaupt "scalen".. kann das LoadImage() sich das nicht gleich in "voll" reinziehen? Irgendeiner muss ja eh skalieren.. ohne Tmp-Files wäre es natürlich auch noch besser, falls es geht, aber wie gesagt, ich habe die Thematik noch nicht ganz umrissen, wo der "Lock" auf die Files sein soll.. bei mir ging der "Replace" erstmal wie erwartet über Deinen Dialog, obwohl der DO-Replace-Dialog da noch offen rumstand.

EDIT: Auch mal mit 3 Files probiert und immer im DO-Replace-Dialog Deinen CompareImage-Replace angestoßen.. war ok, ob man dann "Skip" oder nochmal "Replace" im DO-Replace-Dialog drückte, war auch egal, hat funktioniert.
Benutzeravatar
Kundal
Moderator
Beiträge: 135
Registriert: 24. Okt 2021 18:02
Betriebssystem: Windows 10 Pro

Re: Dateiersetzen bestätigen (Dialog)

Beitrag von Kundal »

Super! Danke für deinen Einsatz. Ich wusste, du schüttelst mal eben was raus, was die Sache voranbringt.
Arg.. immer dieses 1000 Sachen gleichzeitig machen und 999 davon haben gar keine Prio! o)
Helfersyndrom? :D

Hätte ich auch selbst drauf kommen können, die temporären Dateien direkt mit ImageConvert zu erzeugen.
- Der Eintrag mit "Say" haut bei mir eine Fehlermeldung raus, aber ohne Say geht's (ist wohl ein Scriptbefehl von dir, den es bei mir nicht gibt, oder?).
- Aus meinem Dialog kann der "Ersetzen"-Button besser raus. Das Ersetzen kann man ja lieber im Standard-Dialog mit allen Optionen machen und das falschrum-Ersetzen kann dann auch nicht passieren. In meinem Dialog wären allerdings die Bezeichnungen Quelle und Ziel irreführend, wenn der Befehl vom oberen Vorschaubild aufgerufen wird. Mal sehen, ob ich es hinkriege, dass das Quellbild immer links und das Zielbild rechts erscheint oder die Bezeichnung wenigstens korrekt ist.
Mein Dialog dient dann nur noch dem Zweck, die beiden Dateien vergrößert anzuschauen, bevor man sich für eine Aktion im Standard-Dialog entscheidet.
Ich werde heute abend weiter daran basteln.
Benutzeravatar
Kundal
Moderator
Beiträge: 135
Registriert: 24. Okt 2021 18:02
Betriebssystem: Windows 10 Pro

Re: Dateiersetzen bestätigen (Dialog)

Beitrag von Kundal »

So, ich habe das Skript jetzt überarbeitet und ein paar überflüssige Zeilen entfernt. Der Dialog bietet jetzt nur noch eine skalierte Vorschau der Dateien ohne "Ersetzen"-Schalter und über den Bildern wird der richtige vollständige Pfad des jeweiligen Bildes angezeigt, egal von welchem Vorschaubild der Dialog aufgerufen wird. Das Bild, von dem der Dialog aufgerufen wird erscheint immer auf der linken Seite.

Für Mazze nochmal die Instruktionen zur Installation und Handhabung des Skripts:
1) Das Skript nach /scripts kopieren oder per Menüleiste->Einstellungen->Skript installieren.. installieren.
2) Dann Menüleiste->Einstellungen->Dateitypen->Alle Dateien öffnen und im Reiter Ersetzen-Menü auf Neu klicken um einen neuen Befehl zu erstellen. Dem Befehl im Feld Aktion einen Namen geben und als Schaltercode folgendes eintragen:

Code: Alles auswählen

CompareImages Sourcefile="{filepath$}" Destfile="{filepathdest$}"
3) Den Kopierbefehl starten und wenn der Ersetzen-Dialog erscheint per Rechtsklick auf das (vorzugsweise untere) Vorschaubild den Dialog aus dem Kontextmenü starten. Der Dialog hat keine weitere Funktion und dient nur der Betrachtung.
4) Den Dialog per OK oder Abbrechen beenden und im Standard-Ersetzen-Dialog deine Aktion wählen.

Wenn du eine andere Skalierung als 1024x1024 möchtest, kannst du das im Skript in den Zeilen 75 und 77 ändern.
CompareImages.png
Dateianhänge
CompareImages.js.txt
(4.19 KiB) 257-mal heruntergeladen
Mazze45
Beiträge: 3
Registriert: 11. Apr 2024 17:06
Betriebssystem: Windows 11 Pro

Re: Dateiersetzen bestätigen (Dialog)

Beitrag von Mazze45 »

Danke an alle. Aber...

Das ist mir alles viel zu umständlich und zu unkomfortabel. Werde "ACDSee benutzen. Das bietet sogar eine zoom funktion beim vergleich 2er Bilder. (Tolles Programm, kann ich jedem empfehlen.)
Benutzeravatar
tbone
Supporter
Beiträge: 440
Registriert: 29. Okt 2021 00:45
Betriebssystem: Windows 10 Pro

Re: Dateiersetzen bestätigen (Dialog)

Beitrag von tbone »

Ja, der einfache Prototyp-Dialog hat natürlich Schwächen, die wir ja auch schon angeschnitten haben und weswegen hier auch schon 2 Tools vorgestellt wurden, die funktional besser sind. Zeig doch bitte auch nochmal, wie das jetzt in ACDSee aussieht, dann haben wir hier eine schöne Palette Optionen!

Du wolltest das doch aber eigentlich mit DO und dem Replace-Dialog hinbekommen, oder!?
Die Vorschau Bilder im "Dateiersetzen bestätigen Dialog" sind sehr sehr klein gehalten, was ein vergleich fast unmoglich macht.
Das war, worum wir uns bislang hier bemüht haben. Eine Integration im DO Replace-Dialog bekommst Du mit ACDSee vermutlich nicht, oder machst Du den Folder-Merge jetzt irgendwie mit ACDSee anstatt mit DO? Erzähl mal, wir können hier alle noch was lernen! o)
Antworten