Как программно изменить свойства объекта AutoCAD в Python - PullRequest
1 голос
/ 31 марта 2020

Я хочу автоматически обработать кучу чертежей AutoCAD, используя Python. Для этого мне нужно программно изменить свойства объектов рисования. Некоторое время я боролся, но безрезультатно.

Этот код я использую для чтения .dxf и открытия файлов .dwg:

import win32com.client
import dxfgrabber
import os

folder = r'C:\path\to\my\folder'
filename = 'my_file'

dwg_path = os.path.join(folder, filename + '.dwg')
dxf_path = os.path.join(folder, filename + '.dxf')

acad = win32com.client.dynamic.Dispatch("AutoCAD.Application")
doc = acad.Documents.Open(dwg_path)
acad.Visible = True

dxf = dxfgrabber.readfile(dxf_path)

Затем я перебираю объекты, помещенные в слой с именем FirstLayer, и выбираю один из них:

item = [obj for obj in dxf.entities if obj.layer == 'FirstLayer'][0]

Эта конкретная сущность является текстовым объектом:

In [1122]: type(item)
Out[1122]: dxfgrabber.dxfentities.Text

In [1123]: item.insert
Out[1123]: (4022.763956904745, 3518.371877135191, 0.0)

In [1124]: item.layer
Out[1124]: 'FirstLayer'

In [1125]: item.handle
Out[1125]: '298'

Моя цель состоит в том, чтобы изменить свойства, такие как color, layer, et c. Это одна из моих попыток переместить текстовый объект на другой слой с именем SecondLayer:

doc.SendCommand(f'CHPROP {item.insert[0]},{item.insert[1]} LA\n SecondLayer\n ')

Я думаю, проблема в том, что объект нельзя выбрать через координаты точки вставки. Я также попытался (безуспешно) выбрать объект по его ручке, используя следующий скрипт:

_CHPROP (handent 298) _LA SecondLayer 

Есть идеи, как обойти это?


РЕДАКТИРОВАТЬ
Я пришел к следующему решению, прежде чем @Lee Ma c опубликовал свой отличный ответ:

doc.SendCommand(f'CHPROP (handent "{item.handle}") \n_LA SecondLayer\n ')        

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

После ввода команды CHPROP в последующем запросе выбора объекта вам потребуется либо указать одно или несколько имен объектов (которые можно получить путем преобразования дескриптора с использованием функции AutoLISP handent), либо указать набор выбора. (который может быть получен с использованием функции AutoLISP ssget).

Вы были очень близки с использованием handent, однако дескрипторы сущностей в AutoCAD представлены шестнадцатеричными строками и т. д. вам нужно будет снабдить функцию handent строковым аргументом, заключенным в двойные кавычки, например:

(handent "298")

Если предоставленный дескриптор действителен, handent вернет указатель имени объекта:

_$ (handent "3B8")
<Entity name: 7ffff706880>

Однако, поскольку CHPROP принимает аргумент набора выбора, вам не нужно перебирать каждую сущность, а вместо этого просто снабжать CHPROP набором выбора фильтра, например:

doc.SendCommand(f'CHPROP (ssget "_x" (list (cons 8 "FirstLayer"))) LA\n SecondLayer\n ')
0 голосов
/ 01 апреля 2020

Дескриптор в файлах DXF хранится в виде строки HEX, возможно, AutoCAD требуется целочисленное значение, но я не эксперт AutoCAD (@ LeeMa c). Преобразовать строку HEX в int в Python на int('298', 16).

...