pythoncom & _midlSAFEARRAY

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Verzeih. Ich hab mich irgendwie verlesen & 2D statt 3D in deinen Antworten angenommen. Insofern: ja, das ist für 3D & eher nicht für technische Zeichnungen. GLAUBE ich, probiert hab ich es nicht.

Was mich zur Frage bring: was willst du eigentlich erreichen? Es klingt ein bisschen nach einem XY-Problem. Wenn es zB nur um die Anlage technischer 2D Skizzen geht, dann ist es ggf viel besser direkt ein DXF zu erzeugen. Das kannst du dann importieren in DesignCAD, oder was auch immer mit machen.
zarathustra
User
Beiträge: 59
Registriert: Samstag 17. April 2010, 23:02

Hallo,

ich wollte u.a. Weg-Zeit-Diagramme in Straßenskizzen einbauen. Bzw. Zum Zeichnen von Kurven oder Einmündungen Makros verwenden.

Der Excel-Weg hat eine Besonderheit: Ich lasse via Python ein Numpy-Array mit 1000 Punkten errechnen, was die x-Werte eines Simus zwischen 0 und 2*pi darstellt. Aus den x und y Werten bastel ich dann das array für SetCommandPoints in VBA zusammen. Das funktioniert auch. Ich bekomme in DesigvCAD den Sinus gezeichnet. Erhöhe ich in "linspace" die ANzahl auf 10.000, dann wird nur noch die erste Halbwelle des Sinus dargestellt.

Gibt es dafür eine Erklärung?

Viele Grüße und schönes Wochenede

Zarathustra
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und welches Dateiformat liegt da dann vor? Oder brauchst du das CAD für Ankerpunkte?

Was dein Sinus-Problem angeht: kann ich nur raten. SetPoints mag ein internes limit haben, bzw. das CAD allgemein.
zarathustra
User
Beiträge: 59
Registriert: Samstag 17. April 2010, 23:02

Die Berechnungsergebnisse definieren einen Spline in der x-y-Ebene, dessen Startpunkt ich aber mit der Maus setzen möchte. Entlang des Splines wird dann die Aufsicht eines Modells entsprechend den Ergebnissen kopiert und ausgerichtet. Der Spline stellt die Fahrlinie eines Kfz dar. Das Modell ist die Aufsicht auf ein Kfz. Es könnte so ein Ausweichvorgang vor einem Hindernis dargestellt werden.

Dieses SetCommandPoints benötigt ein Array aus Punktetripeln (x1, y1, z1, x2, y2, z2, usw. mit z immer Null). Das gab damals bei Lazarus auch Probleme mit SafeArray, aber ich konnte es Typecasten. Das Typecasting funzt in Python scheinbar nicht.

Na ich hab's aufgegeben. Das Safearray ist vermutlich nicht das einzige Problem der Typebibliothek unter Python vernute ich.
zarathustra
User
Beiträge: 59
Registriert: Samstag 17. April 2010, 23:02

Hallo zusammen,

ich habe meine "Automatisierung" mal wieder aufgegriffen und bin tatsächlich dank __deets__ ein Stück weiter. Ich habe von "comtypes" wieder zurück auf "win32com" gewechselt und mit VARIANTS gearbeitet. Das hat dazu geführt, dass ich Numpy-Arrays an "SetCommandPoints()" übergeben kann und diese dann auch dargestellt werden.

Jetzt wollte ich einen Layer über sein "Item(Nummer)" anspreche. Wenn ich hier anstelle von Nummer eine Integer z.B. 4 eingebe, (DcLays.Item(4).Name = "Schraube") dann bekomme ich die Fehlermeldung:

'int' object has no attribute '_oleobj_'

Meine Frage: Wie "Typecaste" ich einen Integer in ein __oleobj__?

c_int(4) oder VARIANT wird auch nicht akzeptiert. Auch wenn ich z.B Lay = c_int(4) mit "byref(Lay)" an DcLay.Item(byref(Lay)).Name = "Schraube" übergebe gibt es die Meldung, dass das Übergebene kein __oleobj__ sei.

Die ganze Fehlermeldung:

File "C:\Python3.6.4-32\lib\site-packages\win32com\gen_py\DD0F69E1-1E0D-4064-94FA-2ED7ADC72C5Dx0x24x0.py", line 5754, in Item
ret = self._oleobj_.InvokeTypes(0, LCID, 1, (9, 0), ((16396, 1),),vNameOrIndex
AttributeError: 'int' object has no attribute '_oleobj_'


Hier die Funktion ab Zeile 5753:

def Item(self, vNameOrIndex=defaultNamedNotOptArg):
ret = self._oleobj_.InvokeTypes(0, LCID, 1, (9, 0), ((16396, 1),),vNameOrIndex
)
if ret is not None:
ret = Dispatch(ret, 'Item', '{CA4A3EE7-6459-4B89-9304-BCD960BD96A5}')
return ret



Vielen Dank für Tipps

Zarathustra
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ein Variant vom Typ Integer mit Wert 4 erstellen?
zarathustra
User
Beiträge: 59
Registriert: Samstag 17. April 2010, 23:02

Code: Alles auswählen

import win32com.client as win32
from ctypes import c_int, byref
from win32com.client import VARIANT
import pythoncom
Ich habe verschiedene VARIANT-Arten probiert:

Code: Alles auswählen

vLay = win32.VARIANT(pythoncom.VT_I4, 4)
vLay1 = win32.VARIANT(pythoncom.VT_BYREF | pythoncom.VT_I4, 4)
vLay2 = VARIANT(pythoncom.VT_BYREF | pythoncom.VT_ARRAY | pythoncom.VT_I4, 4)
dann kommt immer: AttributeError: 'VARIANT' object has no attribute '_oleobj_'

Nehme ich ein

Code: Alles auswählen

Lay = c_int(4)
und füge es ein:

Code: Alles auswählen

DcLays.Item(Lay).Name = "Schraube"
dann kommt:
AttributeError: 'c_long' object has no attribute '_oleobj_'

füge ich es mit "byref" ein:

Code: Alles auswählen

DcLays.Item(byref(Lay)).Name = "Schraube"
kommt:
AttributeError: 'CArgObject' object has no attribute '_oleobj_'

Das macht mich ratlos.

Zarathustra
zarathustra
User
Beiträge: 59
Registriert: Samstag 17. April 2010, 23:02

Muss man zusätzlich eine "stdole.tlb" wrappen und sich das was rausholen?

Zarathustra
Antworten