Форум сайта python.su
Есть работающий фрагмент примера на visual basic:
—–8<——
Dim TopApp As TopSolid.Application
Dim TopDoc As TopSolid.DocumentDesign
Set TopApp = New TopSolid.Application
' create a new document *.top
Set TopDoc = TopApp.Documents.Add(“top”)
Dim TopCircle As TopSolid.Curve
' Create a basic circle
Set TopCircle = TopDoc.Curves.AddBasicCircle(0, 0, 0, 1, 0, 0, 0, 1, 0, 0.01)
—–8<——
Подскажите пожалуйста, как аналогично это сделать на Питоне?
С применением comtypes я получаю TopApp и TopDoc, но уж никак не TopDoc.Curves. Мне кажется, что дело в виде связывания.
Офлайн
Код? Traceback, ошибки?
Офлайн
Код был примерно такой:
from comtypes.client import CreateObject TopApp = CreateObject('TopSolid.Application') TopApp.Visible = True TopDoc = TopApp.Documents.Add('top') TopCircle = TopDoc.Curves.AddBasicCircle(0, 0, 0, 1, 0, 0, 0, 1, 0, 0.01) # # Тут выскакивает ошибка по поводу отсутствия свойства Curves в TopDoc
Отредактировано Andrey Skobeldin (Июнь 30, 2012 21:53:44)
Офлайн
С TopSolid не знаком, но в Autocad например, при получении списка объектов возвращаются IAcadEntity вместо конкретных IAcadLine и т.п.
Для того чтобы получить нужный интерфейс, есть несколько вариантов
С Автокадом всегда работает такой:
obj = comtypes.client.GetBestInterface(obj)
TopDoc = TopDoc.QueryInterface(comtypes.gen.TopSolid.IDocumnetOrSomethingElse) # нужно заменить на правильный
Офлайн
Как то так получилось получить Curves:
curves = win32com.client.CastTo(doc, 'ICurves') #curves #<win32com.gen_py.TopSolid 6.10 Type Library.ICurves instance at 0x23988184> c1 = curves.AddBasicLine(0, 0, 0, 0.3, 0, 0) # ругается # com_error: (-2147352573, 'Член группы не найден.', None, None)
# Result is of type ICurve def AddBasicLine(self, Sx=defaultNamedNotOptArg, Sy=defaultNamedNotOptArg, Sz=defaultNamedNotOptArg, Tx=defaultNamedNotOptArg , Ty=defaultNamedNotOptArg, Tz=defaultNamedNotOptArg): 'Add a basic line' ret = self._oleobj_.InvokeTypes(3, LCID, 1, (9, 0), ((5, 1), (5, 1), (5, 1), (5, 1), (5, 1), (5, 1)), Sx, Sy, Sz, Tx, Ty, Tz) if ret is not None: ret = Dispatch(ret, u'AddBasicLine', '{2EF8935B-964A-482E-AA8D-853517AADBBE}') return ret
Офлайн
Так вы comtypes используете или win32com? Лучше что-то одно, и по мне - это comtypes.
Andrey SkobeldinЕсли doc - это документ, то мне кажется, что его приводить надо к IDocumentDesign,
curves = win32com.client.CastTo(doc, ‘ICurves’)
doc = doc.QueryInterface(comtypes.gen.TopSolid.IDocumentDesign)
doc.Curves.AddBasicLine(0, 0, 0, 0.3, 0, 0)
Andrey SkobeldinВ Автокаде это нужно потому что методы принимают массив чисел определенного типа (double), а здесь, судя по документации, передается все правильно.
Попробовал упаковать аргументы в array (что работало в Автокаде) - выдает TypeError: float() argument must be a string or a number
Отредактировано reclosedev (Июль 1, 2012 12:37:02)
Офлайн
Да, сработало! Благодарю за помощь!
Офлайн