Seite 2 von 2
Re: pythoncom & _midlSAFEARRAY
Verfasst: Freitag 24. November 2017, 09:51
von __deets__
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.
Re: pythoncom & _midlSAFEARRAY
Verfasst: Freitag 24. November 2017, 21:36
von zarathustra
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
Re: pythoncom & _midlSAFEARRAY
Verfasst: Samstag 25. November 2017, 13:37
von __deets__
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.
Re: pythoncom & _midlSAFEARRAY
Verfasst: Mittwoch 29. November 2017, 23:06
von zarathustra
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.
Re: pythoncom & _midlSAFEARRAY
Verfasst: Mittwoch 19. September 2018, 20:18
von zarathustra
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
Re: pythoncom & _midlSAFEARRAY
Verfasst: Mittwoch 19. September 2018, 21:09
von __deets__
Ein Variant vom Typ Integer mit Wert 4 erstellen?
Re: pythoncom & _midlSAFEARRAY
Verfasst: Donnerstag 20. September 2018, 16:22
von zarathustra
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
und füge es ein:
dann kommt:
AttributeError: 'c_long' object has no attribute '_oleobj_'
füge ich es mit "byref" ein:
kommt:
AttributeError: 'CArgObject' object has no attribute '_oleobj_'
Das macht mich ratlos.
Zarathustra
Re: pythoncom & _midlSAFEARRAY
Verfasst: Donnerstag 20. September 2018, 16:25
von zarathustra
Muss man zusätzlich eine "stdole.tlb" wrappen und sich das was rausholen?
Zarathustra