Макрос для оформления чертежей

Автор Merlin, 13.11.19, 17:01:26

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Merlin

Добрый день! Имеется следующая ситуация. Есть старые чертежи которые нужно оформить под нынешние требования нашей организации.
А именно подправить шрифты: размеров, разрезов, выносных элементов, основной надписи и тд.
Средствами записи Компас этого добиться не получается, макрос не записывается. (Или всё таки записывается?)

Как я понимаю, нужно в ручную с помощью справочной системы SDK.
Вопрос: С чего нужно начать? на что ссылаться? можно с небольшим примером, а дальше я сам

p3452

Макросом не обойдетесь...
Нужно написать программку на любом языке программирования (обычное Windows приложение), которая будет давать Вам возможность:
- выбрать файлы, папки с файлами для обработки,
- задать параметры для обработки и их новые значения,
- автоматически запустить Компас в открытом или фоновом режиме,
- автоматически обработать заданные файлы: открыть, отредактировать, закрывать,
- автоматически вести протокол обработки и отображать его на экране,
- открыть любой из этих файлов в Компас.

Много примеров в SDK - если запустить SDK.chm и набрать в Поиске "Демонстрационные примеры".., но все они не про Python.

Merlin

Цитата: p3452 от 13.11.19, 18:19:08Макросом не обойдетесь...
Нужно написать программку на любом языке программирования (обычное Windows приложение), которая будет давать Вам возможность:
- выбрать файлы, папки с файлами для обработки,
- задать параметры для обработки и их новые значения,
- автоматически запустить Компас в открытом или фоновом режиме,
- автоматически обработать заданные файлы: открыть, отредактировать, закрывать,
- автоматически вести протокол обработки и отображать его на экране,
- открыть любой из этих файлов в Компас.

Много примеров в SDK - если запустить SDK.chm и набрать в Поиске "Демонстрационные примеры".., но все они не про Python.
Ого как много всего.
А мне то нужно вручную Открыть готовый чертеж, запустить макрос чтобы он поправил шрифты и всё))

Вират Лакх

#3
Используя python, можно сделать оба варианта. Вопрос в том, что будет быстрее для вас: прописать выбор файлов, открытие, закрытие или вручную это сделать.
Можете попробовать записать макрос с помощью программы от Slaviation называется как-то PyKompasMacro или типа того.
Начать можно с подключения к компасу и получения активного документа. Какой API будете преимущественно использовать. Я предпочитаю седьмой вместо пятого. Пятый использую тогда, когда нет возможности сделать что-то на апи7.
Ссылаться вроде ни на что не надо, разве что, скорее всего, понадобятся файлы API .py, которые должны были быть установлены с библиотекой компас-макро или которые можно сгенерировать самому.
Подозреваю, что может быть достаточно добраться до настроек документа и там изменить, а не перебирать все объекты.

Upd. Вот пример, который будет работать на обоих версиях питона:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

title = 'Программа'

import sys
if sys.version_info[0] < 3:
   import Tkinter as tk, tkMessageBox
   def encodestr(txt): return txt.encode('cp1251') # Скорее всего Вам не понадобится эта строка, можно удалить
   def decodestr(txt): return txt.decode('cp1251')
else:
   import tkinter as tk, tkinter.messagebox as tkMessageBox
   def encodestr(txt): return txt  # Скорее всего Вам не понадобится эта строка, можно удалить
   def decodestr(txt): return txt

try:
   from win32com.client import Dispatch, gencache # Для этого должен быть установлен pywin32
   try:
      KompasAPI5 = gencache.EnsureModule('{0422828C-F174-495E-AC5D-D31014DBBE87}', 0, 1, 0) # та самая генерация файлов API .py на случай, если у вас их нет или какая другая ошибка
      KompasAPI7 = gencache.EnsureModule('{69AC2981-37C0-4379-84FD-5DD2F3C0A520}', 0, 1, 0)
      KompasConst = gencache.EnsureModule('{75C9F5D0-B5B8-4526-8681-9903C567D2ED}', 0, 1, 0).constants # Я константами не пользуюсь, обычно удаляю это
      KompasConst3D = gencache.EnsureModule('{2CAF168C-7961-4B90-9DA2-701419BEEFE3}', 0, 1, 0).constants # Я константами не пользуюсь, обычно удаляю это
   except:               # Сюда можно записать свои модули: import ... as KompasAPI5, ... as KompasAPI7
      import KompasAPI5, KompasAPI7, KompasConst, KompasConst3D # И отсюда импорт констант можно удалить
except:
   from traceback import format_exc
   tk.Tk().withdraw()
   tkMessageBox.showerror(title, decodestr(format_exc())) # Выдача сообщения об ошибке импорта необходимых модулей
   sys.exit()

KompasObject = Dispatch('Kompas.Application.5', None, KompasAPI5.KompasObject.CLSID) # Если вам API5 не нужен будет, то можно удалить.
iApplication = Dispatch('Kompas.Application.7')   # Или KompasObject.ksGetApplication7(), оба варианта работают. Если вам API7 не нужен будет, то можно удалить.
if not iApplication.Visible: iApplication.Visible = True   # Здесь можно iApplication заменить на KompasObject в зависимости от того, какой интерфейс получаете.

iDocument = iApplication.ActiveDocument # Получение активного документа
iDocumentSettings = iDocument.DocumentSettings # Настройки документа, только тут ничего интересного нет
iDrawingDocumentSettings = KompasAPI7.IDrawingDocumentSettings(iDocumentSettings)  # Пример вызова метода IUnknown::QueryInterface
print(iDrawingDocumentSettings.SheetAutoCount) # Оказывается, через API совсем мало настроек можно получить. Или надо искать в другом месте

ksDocument2D = KompasObject.ActiveDocument2D() # Получение 2D-документа через API5
# дальше есть ksGetDocOptions и т.д.

dimak222

Добрый день!

Попал в такую-же ситуацию, в параметрах текущего чертежа необходимо поменять настройки высоты размерной надписи, линий-выносок, ТТ, позиций, линии разреза, взглядов....

Добрался до "ksGetDocOptions", судя по скудному перечню настроек документа, нужных настроек тут нет.

from win32com.client import Dispatch, gencache # библиотека API Windows

KAPI5 = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0) # API5 КОМПАСа
iKompasObject = Dispatch("Kompas.Application.5", None, KAPI5.KompasObject.CLSID) # интерфейс API КОМПАС

iDocument2D = iKompasObject.ActiveDocument2D() # проверка открыт ли 2D докумет

iksDimensionsOptions = iKompasObject.GetParamStruct(80) # интерфейс параметров настройки размеров
iksDimensionsOptions.Init() # инициализировать параметры

##iksGetSysOptions = iKompasObject.ksGetSysOptions(11, iksDimensionsOptions) # получить системные настройки (11 — настройки размера)

iksGetDocOptions = iDocument2D.ksGetDocOptions(11, iksDimensionsOptions) # получить настройки текущего документа (11 — настройки размера)

##iksDimensionsOptions.arrowLength = 10

print(iksDimensionsOptions.arrowLength)




iksLtVariant = iKompasObject.GetParamStruct(108) # интерфейс для хранения данных некоторого типа.
iksLtVariant.Init() # инициализировать параметры

iksGetDocOptions = iDocument2D.ksGetDocOptions(2, iksLtVariant) # получить настройки текущего документа  (2 — настройки зачернения стрелок)

##iksLtVariant.intVal = 0

print(iksLtVariant.intVal)




iSheetOptions = iKompasObject.GetParamStruct(118) # интерфейс параметров оформления листа документа
iSheetOptions.Init() # инициализировать параметры

iksGetDocOptions = iDocument2D.ksGetDocOptions(4, iSheetOptions) # получить настройки текущего документа (4 - настройка параметров листа документа)

##iSheetOptions.shtType = 1

print(iSheetOptions.shtType)

Есть ли какие-то ещё варианты добраться до этих настроек?

Student2025

#5
Вижу только один способ - IStylesManager.
Нет не какой группировки по назначениям, так что все разбросано.
Скинуть пример ?

Student2025

Мимо,

Doc2D = api5_.ActiveDocument2D()

iksDimensionsOptions = api5_.GetParamStruct(74) # интерфейс ksTextStyleParam
iksDimensionsOptions = KAPI5.ksTextStyleParam(iksDimensionsOptions)

# инициализировать параметры
iksDimensionsOptions.Init()

Doc2D.ksGetDocOptions(11, iksDimensionsOptions) # получить настройки текущего документа (11 — настройки размера)

print(iksDimensionsOptions.height)
print(iksDimensionsOptions.fontName)

а больше не чего не могу найти в справке и вообще ksTextStyleParam - это текст на чертеже и по сути не как не связан с размером.

Искал объекты по словам Dimension, Option, Setting и ни чего.

Student2025


Student2025

Уже который день пытаюсь решить, оно вообще реализовано ? а ту я как дурачок перебираю комбинации :evil:                                                                   .

Student2025

В общем подписался на события ksKompasObjectNotify и ksDocument2DNotify и меняю в настройках высоту шрифта размеров и на документе вижу они все перестраиваются а событий не происходят. Только на простых операциях события появляются.

Куда не кинь, всюду клин..

Gruden


Student2025


Gruden

Цитата: Student2025 от 05.07.26, 22:06:16А пример реализации есть ?
Так всё тоже самое, как с ksKompasObjectNotify и ksDocument2DNotify, только события другие, в SDK примеры есть.

Student2025

Цитата: Gruden от 05.07.26, 23:01:15в SDK примеры есть
Ткните ! - я все sdk просмотрел от 9 до 24 и не одного примера не нашел с ksDrawingObjectNotify.

Gruden

EventsAuto - используется - ksObject2DNotify.
EventsCom - используется - IObject2DNotify.
step12 - используется - IObject2DNotify.

PS. https://help.ascon.ru/KOMPAS_SDK/25/ru-RU/ksdrawingobjectnotify.html?q=ksDrawingObjectNotify

Student2025

Цитата: Gruden от 06.07.26, 07:57:06EventsAuto - используется - ksObject2DNotify.
EventsCom - используется - IObject2DNotify.
step12 - используется - IObject2DNotify.

Это я пробовал, но не чего не дало в контексте данного вопроса - получаю события, но как их спроецировать на плоскость настроек ?

Gruden

Цитата: Student2025 от 06.07.26, 08:05:18Это я пробовал, но не чего не дало в контексте данного вопроса - получаю события, но как их спроецировать на плоскость настроек ?
Так и занимайтесь настройками, зачем в события лезть?

Student2025

Цитата: Gruden от 06.07.26, 08:09:21Так и занимайтесь настройками
Так я зашел в тупик и не вижу объекта управляемого настройками не документа, не системы
(
cdw7 iDoc DocumentSettings
cdw7 iDoc2D DocumentSettings
cdw7 iDocDr DocumentSettings
api7 IDocument2DSettings
api7 IDocument3DSettings
api7 IDocumentSettings
api7 IDocumentSettings1
api7 IDrawingDocumentSettings
api7 IFragmentDocumentSettings
api7 ILibArraySettings
api7 ILibItemSettings
api7 INewDocument3DSettings
api7 INewPartDocumentSettings
api7 IPrintJob_PrinterSettings
api7 ISnapSettings
api7 ISystemSettings
api7 ISystemTemplatesSettings
)

Цитата: Gruden от 06.07.26, 08:09:21зачем в события лезть?
Так я уж решил что они хоть как то покажут что нужно использовать..

Gruden

Цитата: Student2025 от 06.07.26, 08:42:04Так я зашел в тупик ...
Я пока другого от Вас и не слышал.

Student2025

Цитата: Gruden от 06.07.26, 08:52:51Я пока другого от Вас и не слышал.
Так вы знаете или просто за нос водите форумчан ?