При использовании python и win32com для автоматизации формы программного обеспечения Adobe сталкивается с проблемой с передающими массивами координат 2d. Если вы посмотрите на код, который Adobe отправляет для визуального базового (VB), это просто. Упрощенный пример для рисования линии в Illustrator будет выглядеть следующим образом:Python win32com и 2-мерные массивы
Set appObj = CreateObject("Illustrator.Application")
Set docObj = appObj.Documents.Add
Set pathItem = docObj.PathItems.Add
pathItem.SetEntirePath Array(Array(0.0, 0.0), Array(20.0, 20.0))
Теперь наивное предположение, что VB код может просто быть просто превратился в питон, преобразовывая его следующим образом:
from win32com.client import Dispatch
appObj = Dispatch("Illustrator.Application")
docObj = appObj.Documents.Add()
pathItem = docObj.PathItems.Add()
pathItem.SetEntirePath([ [0.0,0.0], [20.0,20.0] ])
Очевидно , это не так просто, python выдает сообщение об ошибке «Поддерживаются только массивы с размером 1». Теперь я знаю, что существует разница между массивами массивов и двумерными массивами. Итак, вопрос в том, как заставить python создать массив нужного типа?
Я пробовал сделать свой собственный тип VARIANT, но неудачно провалился. Ive также посмотрел на ctypes для этого. У кого-то была такая же проблема и может пролить свет?
PS:
Я знаю, что эта проблема может быть преодолена с помощью:
pathItem = docObj.PathItems.Add()
for point in ( [0.0,0.0], [20.0,20.0]):
pp = pathItem.PathPoints.Add()
pp.Anchor = point
Но есть подобные случаи, когда это на самом деле не работа. Во всяком случае, дело в том, чтобы написать рекомендации по портированию ученикам, чтобы быть ближе к первоначальному намерению.
Да, это работает именно так, что я бы предпочел сделать это в win32com, потому что это то, что было отправлено на эти компьютеры по умолчанию. Ну, еще один месяц переговоров с ИТ-отделом, я полагаю. – joojaa
Замечательно знать joojaa, спасибо за публикацию нового решения! – MrNoob