我如何获得 Python 在 Adob​​e Illustrator 中绘制简单线条的脚本和 Visual Studio 代码

How do I get Python Script to draw a simple line in Adobe Illustrator and Visual Studio Code

正如标题所说,我无法获得 Python 脚本来在 Adob​​e Illustrator 中的两点之间画一条线。以下代码不断产生错误:

from os import linesep
import win32com.client as win32com

app = win32com.GetActiveObject("Illustrator.Application")
docRef = app.Documents.Add()
app.Documents.Add()

myLine = docRef.PathItems.Add()
myLine.Stroked = True
myLine.StrokeWidth =5

myLine.SetEntirePath([[10.,20.], [30, 70]]) #fails here

由于想在这个过程中学习Python,所以我不想使用其他选项。 VBScript、JavaScript 和 AppleScript 有文档,但 Python 速度快,推荐使用,因为它可以处理在我的计算机上打开和关闭文件。

我已经尝试了以下行中数组的几乎所有排列:

myLine.SetEntirePath([[10.,20.], [30, 70]]) #fails here

但没有任何效果。通常我得到错误,

Traceback (most recent call last):
  File "c:\Users\User\Documents\code\python_illustrator_api\test_com_interface.py", line 41, in <module>
    myLine.SetEntirePath([[10.,20.], [30, 70]])
  File "<COMObject Add>", line 2, in SetEntirePath
pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, 'Adobe Illustrator', 'Illegal argument - argument 1\n- Only arrays with dimension 1 are supported', None, 0, -2147220262), None)     
PS C:\Users\User\Documents\code\python_illustrator_api> 

这表明数组格式不正确,但我觉得还不错。我已经尝试了几乎所有的可能性:没有方括号,没有外括号。据我所知 Python,这是具有两个 X,Y 对的数组从两个点绘制一条简单直线的正确格式。

当我尝试时

myLine.SetEntirePath([10.,20.], [50., 100.], [100, 30])

我得到一个不同的错误:

TypeError: SetEntirePath() takes from 1 to 2 positional arguments but 4 were given

那是更有希望的一点,因为它似乎是一个更具描述性的错误。另外,如果我错了,请纠正我,但基本上,VSCode 在使用 Win32com 时没有有用的提示,因为它与 API 对话,对吗?基本上,错误可能来自 Adob​​e Illustrator,但没有像其他版本的 Visual Studio.

那样有帮助的建议

我也尝试过使用 numpy 使用数组,但这也不起作用。

import numpy as np
array1 = np.array([[20, 50], [30, 70]])
myLine.SetEntirePath(array1)

有什么问题吗? win32com 和 Illustrator 之间是否存在某种误解? 这是一件非常基本的事情,获取一个脚本在 Illustrator 上的两点之间画一条线。

我也许可以在打开的 Adob​​e Illustrator 实例上画一条线,使用 Python 脚本抓取 line-segment,然后 reverse-engineer [=52] 的格式=] 喜欢将它的数组发送给它,但这可能有它自己的问题。

不应该做点什么吗?毕竟不是所有这些不同的语言最终都通过通用中间语言进行处理,然后发送到 API?

有人可以对此提出一些解决方案吗? 提前谢谢你

有意思。可能是 SetEntirePath() 方法坏了或者什么的,确实如此。我也没有设法让它与 Python 一起工作。

但有一个解决方法。 pathItems.pathPoints 集合有方法 Add(),因此您可以使用循环将具有给定坐标的任何点添加到路径中,方法如下:

import win32com.client as win32com

app = win32com.GetActiveObject("Illustrator.Application")
doc = app.Documents.Add()

myLine = doc.pathItems.Add()
myLine.stroked = True
myLine.strokeWidth = 5

points = [[10, 20], [50, 100], [100, 30]]
for xy in points:
    point = myLine.pathPoints.Add()
    point.anchor         = xy
    point.leftDirection  = xy
    point.rightDirection = xy

输出: