2017-12-21 2 views
2

Ich bin gerade dabei, mit Win32com.client-Modul zu versuchen und schreiben ein Python-Programm, das eine COM-Schnittstelle verwendet, um MicroStation zu steuern, so wie ich MicroStation zu steuern aus Excel.Erstellen Sie ein com_record ein Objekt aus einem COM-Typ

Das Problem, das ich habe, ist, Objekte eines Typs zu erstellen, der in der COM-Bibliothek definiert ist, ein com_record, nämlich in meinem Fall ein Point3d. Der Point3d ist im Grunde eine C-Struktur von 3 Doppel-X, Y, Z. Ich hatte Zugang zum Point3D Datentyp

struct Point3d { 
    double X; 
    double Y; 
    double Z; 
} 

In Excel nach der MicrostationDGN Bibliothek Referenzierung und einfach neue Variablen mit Dim newpoint As Point3d

definieren könnte Wie kann ich das gleiche in Python zu tun?

Danke,

PS. Ich habe versucht, eine C-Struktur zu schaffen, aber das gibt mir einen Fehler

from ctypes import Structure, c_double 

class Point3d(Structure): 
    _fields_ = [('X', c_double), 
       ('Y', c_double)] 

startPoint = Point3d() 
startPoint.X = 1 
startPoint.Y = 1 

TypeError: Only com_record objects can be used as records 
+0

ich einige Infos hier gefunden http://python.6.x6.nabble.com/How-to-create-a-com-record-td1953557.html, aber ich habe immer noch keine Ahnung, wie das machen com_record Objekt, das ich benötige. – Alex

Antwort

0

Sie suchen nach named tuple suchen.

Zitiert (grob) aus den Dokumenten, möchten Sie:

Point3d = namedtuple('Point3d', ['x', 'y', 'z']) 
+0

Danke für Ihre Antwort! Ich habe es gerade versucht, aber es erzeugt den gleichen Fehler ... TypeError: Nur com_record Objekte können als Datensätze verwendet werden – Alex

+0

Sorry. Ich habe versucht, dich von Ctypes weg zu bewegen und auf einen reinen Python-Ansatz (benanntes Tuple) zuzugehen. Aber wenn Sie planen, die resultierenden Punktobjekte einer Routine zu übergeben, die in Ihrer Frage nicht erwähnt wird, dann müssen Sie den Dokumenten für diese Schnittstelle folgen. Sie erwähnen in Ihrem Kommentar eine URL, die die Verwendung der Windows-spezifischen COM-Unterstützung anstelle von Pythons tragbarer Ctypes-Unterstützung vorschlägt. –

0

Ich fand diese aus der Bibliothek Autor:

r = win32com.client.Record("RecordName", object) 

where "RecordName" is the name of the record, and 'object' is &any* COM object defined in the same type library.

https://mail.python.org/pipermail/python-list/2003-August/214888.html

Ich konnte ein nicht gefunden Objekt dieses Typs, um einen com_record wie beschrieben zu instanziieren, aber ich habe eine Funktion gefunden, die return ns das Objekt, das ich brauche.

startPoint = MS.Point3dFromXYZ(2.0,2.0,0.0) 
Verwandte Themen