Nikon SDK für Kamerasteuerung

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

chrizl hat geschrieben:Danke schön :-)
kein Thema! :-)
chrizl hat geschrieben:Achja, dein Code zeigt mir nun an, dass beide Objekte erstellt wurden und anschließend, dass die D60 ausgewählt wurde.
Als letztes kommt dann noch die Anzahl der Bilder.
So sollte es sein :-)

Kommst Du mit dem Rest dann erst mal alleine klar?
Wenn Probleme auftauchen, kannst Du Dich ja immer noch melden.

Übrigens: Die FileSystemObject-Sachen brauchst Du nicht zu übersetzen.
Da kannst Du die ganz normalen PB-File-Befehle verwenden.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
chrizl
Beiträge: 60
Registriert: 31.08.2004 15:03
Wohnort: Pbg.
Kontaktdaten:

Beitrag von chrizl »

Japp, da komme ich erst einmal so mit klar, nun muss ich erstmal meinen Akku wieder aufladen, damit ich weiter probieren kann.
Mit freundlichen Grüßen,
chrizl
Benutzeravatar
chrizl
Beiträge: 60
Registriert: 31.08.2004 15:03
Wohnort: Pbg.
Kontaktdaten:

Beitrag von chrizl »

Okay, das mit dem Auslesen klappt soweit alles ganz gut.

Nun möchte ich einen Befehl an die Cam übergeben. Problem dabei ist nur, dass diesmal nicht die Punktschreibweise(Items.Count) vorhanden ist, sondern die "Funktion" und dann der "Parameter" wie folgendes:

Code: Alles auswählen

Do While okB <> 2
	okB = 0
	okB = msgbox("Click Ok to shoot, cancel to stop", 1)
	
	if okB = 1 then	
		itemCount = dev.Items.Count
		dev.ExecuteCommand (wiaCommandTakePicture)
		WScript.Sleep(500) ' it takes a moment for the image to be taken   
		Do While dev.Items.Count = itemCount ' loop while new image not yet taken
			WScript.Sleep(10)
		loop
    		itemCount = dev.Items.Count
        	Set img = dlg.ShowTransfer(dev.Items(itemCount))
		fnext = img.FileExtension
		If fnext = "" Then
		       fnext = "NEF"
		End If
		tempfn = outputfolder & "temp\" & dev.Items(itemCount).Properties("Item Name").Value & "." & fnext
	        fn =outputfolder  & dev.Items(itemCount).Properties("Item Name").Value & "." & fnext
		img.SaveFile tempfn 
	        img = null
		Set aFile = fso.GetFile(tempfn )
		aFile.Move fn 
		WScript.Sleep(100)
		WshShell.AppActivate foldername 
		WScript.Sleep(100)
		WshShell.SendKeys "{RIGHT}"
		WScript.Sleep(100)
		WshShell.SendKeys "{END}"
   
	end if 
Loop
Der letzte Teil mit dem übergeben der Datei an den PC ist erstmal nicht so wichtig, eher die Sache:

Code: Alles auswählen

dev.ExecuteCommand (wiaCommandTakePicture)
So wird z. B. auch der Name aus der Kamera gelesen:

Code: Alles auswählen

dev.Items(itemCount).Properties("Item Name").Value
Das wäre auf jeden Fall noch ein großes ? für mich.
Mit freundlichen Grüßen,
chrizl
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

chrizl hat geschrieben:

Code: Alles auswählen

dev.ExecuteCommand (wiaCommandTakePicture)
Wenn Du eine Aktion ausführen möchtest, die keinen Rückgabewert
liefert, dann musst Du ein Invoke auf dem Objekt ausführen.

In diesem Fall hieße es also so:

Code: Alles auswählen

dev\Invoke("ExecuteCommand(wiaCommandTakePicture)")
wiaCommandTakePicture ist ein Konstante mit einem ziemlich schrägen
Wert (eine GUID, wenn ich das korrekt recherchiert habe).

Korrekt sähe es dann so aus:

Code: Alles auswählen

#wiaCommandTakePicture = "{AF933CAC-ACAD-11D2-A093-00C04F72DC3C}"
dev\Invoke("ExecuteCommand('" + #wiaCommandTakePicture +"')")
Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
chrizl
Beiträge: 60
Registriert: 31.08.2004 15:03
Wohnort: Pbg.
Kontaktdaten:

Beitrag von chrizl »

Okay, schon wieder was neues dazu gelernt.

Danke schön :)
Mit freundlichen Grüßen,
chrizl
Benutzeravatar
chrizl
Beiträge: 60
Registriert: 31.08.2004 15:03
Wohnort: Pbg.
Kontaktdaten:

Beitrag von chrizl »

So, erster Teil der Geschichte ist fertig.
Also zumindest soweit, dass ich mit der Kamera Fotos machen kann, im Interval, den ich einstelle usw. usw.....

Microsoft bietet in der wiaaut.dll noch eine Funktion, um die Bilder von der Kamera, bzw. dem Bildübertragungsgerät an den PC zu übertragen.
Das wäre bei Windows XP z. B. der Punkt "Bilder kopieren" im Fenster der Kamera.
Um diese Funktion nutzen zu können, muss man ein Object namens "Item" erstellen. Dieses Object soll als "Item" definiert werden.
Naja, damit komme ich nun aber nicht wirklich klar.

Der Code dafür in VB sähe so aus:

Code: Alles auswählen

Item item = device.Execute
Dim item As Item = device.ExecuteCommand(CommandID.wiaCommandTakePicture)
For Each format As String In item.Formats
    If (format = jpegGuid) Then
        Dim imagefile As WIA.ImageFile = CType(item.Transfer(format),WIA.ImageFile)
        filename = GetFreeFileName
        If (String.IsNullOrEmpty(filename) = false) Then
            imagefile.SaveFile(filename)
        End If
        Me.picLastImage.Load(filename)
        Return filename
    End If
Next 
Der msdn-Teil von der wiaaut sähe so aus:
http://msdn.microsoft.com/en-us/library ... S.85).aspx

Code: Alles auswählen

Syntax

    object.Transfer( _
        [FormatID As String]) As Variant

Parameters

    FormatID
        Optional. String value that specifies one of the FormatID Constants that indicates the requested image format.

        {00000000-0000-0000-0000-000000000000}
            Default. Unspecified format.

Return Value

    Returns an ImageFile object in the format specified in FormatID, if the device supports that format; otherwise this method uses the preferred format for this imaging device.

Ich habe nun schon sogut wie alles ausprobiert und bin noch nicht wirklich fündig geworden, bzw. habe noch nicht wirklich das KnowHow für diese "Anwendung" in COMate.
Daher würde ich mich sehr freuen, wenn ihr mir da auch nochmal weiterhelfen könntet.
Mit freundlichen Grüßen,
chrizl
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Zwar wird empfohlen anstelle den Disphelper das COMate zu benutzen,

Nur hier würde ich empfehlen, da über das WIA-Interface so wenig hier und im
englischen Forum angesprochen wurde, doch lieber den Disphelper, wie im
folgenden Beispiel, zu verwenden :mrgreen:

http://www.purebasic.fr/english/viewtop ... 727#256727

Dort werden VB-Scripte in einer Script-Variable zusammengefasst
und dann mittels dem Disphelper zur Anwendung gebracht.


Gruß, Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Falko hat geschrieben:Dort werden VB-Scripte in einer Script-Variable zusammengefasst
und dann mittels dem Disphelper zur Anwendung gebracht.
kann man auch mit COMate Bild

PB-Code:

Code: Alles auswählen

IncludePath #PB_Compiler_Home + "\srod\comate"
XIncludeFile "comate.pbi"
IncludePath ""

Define ScriptControl.COMateObject
Define VBS.s

ScriptControl = COMate_CreateObject("ScriptControl")

ScriptControl\SetProperty("Language = 'VBScript'")

VBS = PeekS(?VBS)
VBS = ReplaceString(VBS, "'", "$0027")

ScriptControl\Invoke("AddCode('" + VBS + "')")

MessageRequester("", ScriptControl\GetStringProperty("Eval('IPAddress')"))

ScriptControl\Release()

DataSection
  VBS:
  IncludeBinary "test.vbs"
  Data.b 0
EndDataSection
und hier das von Falko verlinkte Beispiel:

VBS (abspeichern als test.vbs):

Code: Alles auswählen

strComputer = "."
Set objWMIService = GetObject("winmgmts:\" & strComputer & "\root\cimv2")
Set IPConfigSet = objWMIService.ExecQuery("Select IPAddress from Win32_NetworkAdapterConfiguration")
For Each IPConfig in IPConfigSet
  If Not IsNull(IPConfig.IPAddress) Then
    For i=LBound(IPConfig.IPAddress) To UBound(IPConfig.IPAddress)
      IPAddress = IPAddress & IPConfig.IPAddress(i) & vbCrLf
    Next
  End If
Next
Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

hmm .. ne SpiegelreflexWebCam wird das letztlich ? Viel Aufwand für #NULL , oder ?

Aber wenn's Spass macht ... :)
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Danke Kiffi. :allright: Sorry, für die späte, Spätschichtbedingte Rückantwort.

@Bobobo, mir ging es ja nicht um die Webcamfunktionen, sondern eher
um die Möglichkeiten, wie man VB-Scripte bezüglich WIAaut.dll in PB nutzen kann.

Einziges Beispiel dazu hatte ich leider nur im englischen Forum in Verbindung
mit dem Disphelper gefunden, daher hier das Posting.

Mit COMate, muss ich mich selbst noch anfreunden :lol:
Schade, das die Hilfe dazu in fließend Englisch ist.
Bild
Win11 Pro 64-Bit, PB_6.11b1
Antworten