Записываю макрос в следующей последовательности:
1. Нажимаю запись, сохраняю макрос.
2. Перехожу через "Параметры текущего чертежа" и изменяю высоту шрифта у размеров на 3,5мм.
3. Нажимаю ОК. В чертеже все размеры меняют высоту. Останавливаю макрос.
4. Открываю любой чертеж, пробую применить полученный макрос, но ничего не происходит.
В чем может быть дело?
В записанном коде, скорее всего действие два, в макрос не пишется.
Записывать с помощью Компаса-Макро в чертеже можно только геометрию, обозначения, размеры, шероховатость, но что то редактировать, когда оно уже создано, нельзя. Тут только в SDK лесть, если умеете.
Цитата: Алхимик от 30.01.17, 09:03:58
Записывать с помощью Компаса-Макро в чертеже можно только геометрию, обозначения, размеры, шероховатость, но что то редактировать, когда оно уже создано, нельзя. Тут только в SDK лесть, если умеете.
Ясно, очень жаль. В программировании 0, но на всякий случай приложу текст макроса, который не работает:
# -*- coding: cp1251 -*-
#|2
import Kompas10API5 as KAPI
import Kompas10API7 as KAPI7
import pythoncom
from win32com.client import Dispatch
import LDefin2D
import LDefin3D
import ksConstants as CONST2D7
import ksConstants3D as CONST3D7
import MiscellaneousHelpers as MH
iKompasObject = Dispatch('KOMPAS.Application.5')
iKompasObject = KAPI.KompasObject(iKompasObject)
MH.iKompasObject = iKompasObject
iApplication = Dispatch('KOMPAS.Application.7')
iApplication = KAPI7.IApplication(iApplication)
MH.iApplication = iApplication
iDocument2D = iKompasObject.ActiveDocument2D()
iDocument = iApplication.ActiveDocument
iKompasDocument2D = KAPI7.IKompasDocument2D(iDocument)
Тогда такой вопрос. Также пытаюсь через макрос вставить технические требования (файл прилагаю). Но макрос опять не работает (его тоже прилагаю). Видел у кого-то на канале ютуба, что должно работать.
В вашем примере компас углядел ошибку при вводе значения под дробью.
Выполнил ваш макрос - ничего не происходит. (компас 16.1.7, 32разрядный).
Действительно, но проверял работало, сейчас не работает и ругается на строку, которая хочет поставить точку в конце второго пункта)))
ЦитироватьiTextItem.ItemType = CONST2D7.constants.ksTItksTItFractionEnd
в SDK такой тип не нашел)
Должен работать, но точку в конце второго пункта не ставит.
Все работает, спасибо. А можно сделать, чтобы шрифт IT14/2 был меньше?
И последний вопрос: можно ли как-то автоматизировать изменение высоты шрифтов размеров, выносок, разрезов, видов и т.д. Очень часто приходится это делать.
Цитата: mikor от 30.01.17, 10:12:00
Все работает, спасибо. А можно сделать, чтобы шрифт IT14/2 был меньше?
Запишите когда он вообще строкой идет и макрос ваш должен работать.
Цитата: Алхимик от 30.01.17, 09:03:58
Записывать с помощью Компаса-Макро в чертеже можно только геометрию, обозначения, размеры, шероховатость, но что то редактировать, когда оно уже создано, нельзя. Тут только в SDK лесть, если умеете.
А зачем - в SDK? Если из текста макроса многое понятно. Например, понятно, что для действий mikora в макросе нет готовых конструкций. А, значит, их надо создавать самостоятельно в соответствии с используемым языком программирования. Либо искать: где кто сделал что-то близкое.
Не могу побороть следующий глюк.
1. Если в чертеже есть ТТ, то они заменяются макросом нормально.
2. Если создаю новый чертеж, то третья строчка не помещается в одну строку (на картинке). Только если зайти в редактирование ТТ и просто их сохранить, ничего не изменяя, то все становится нормальным. Но это уже лишние телодвижения, от которых и хотел избавиться.
Макрос прилагаю.
Вы сами ответили на свой вопрос, нужно сначала удалить ТТ, а потом записывать новые данные.
iTextItem.Delete()
iTechnicalDemand.Update()
Ваш макрос не работает, пробовал вставить 2 строчки в свой - и мой перестал работать.
Так работает?
Работает, но глюк с переносом строки сохранился.
Странно, у меня добавляет в старый и новый чертеж с переносом.
А хотелось-то без переноса! И попробуйте зайти в редактирование и просто сохранить, ничего не изменяя - тогда перенос исчезнет.
Пойдем от обратного, раз при повторном редактировании ТТ все нормально, то организуем два входа в ТТ для заполнения.
Вот теперь все отлично, спасибо. При выполнении макроса мельком видно, как происходят хитрые последовательности действий :)
Если интересно, то вот что можно записать макросом из чертежа, лежит тут: C:\Program Files\ASCON\KOMPAS-3D V**\Libs\Kompas-Macro в файле 'Pik'
Справку я прочитал, заметил пункты:
– таблица на чертеже,
– текст,
– технические требования
Но не обратил внимание на "Объекты, создание которых может быть записано в макрос". Думал, что и редактировать можно.
Компас-Макро да, но можно SDK читать. Или на форуме полазить.
Вообще если не лесть в настройки текущего чертежа, то изменяю высоту шрифтов просто выделив объекты и в свойствах изменяю значения для них скопом. Пример: Изменения длины выбранных отрезков (https://www.youtube.com/watch?v=GNRqHY6xuDI). Недостаток: новые объекты будут иметь формат заложенный в чертеж.
Для спортивного интереса записал макрос типа как тут: https://www.youtube.com/watch?v=izUd-xzLvM0
Запускаю - ничего не делает. Сделал попроще макрос а ля "сохранить как". Тоже ничего не делает. К чему бы это?
# -*- coding: cp1251 -*-
#|ва
import Kompas10API5 as KAPI
import Kompas10API7 as KAPI7
import pythoncom
from win32com.client import Dispatch
import LDefin2D
import LDefin3D
import ksConstants as CONST2D7
import ksConstants3D as CONST3D7
import MiscellaneousHelpers as MH
iKompasObject = Dispatch('KOMPAS.Application.5')
iKompasObject = KAPI.KompasObject(iKompasObject)
MH.iKompasObject = iKompasObject
iApplication = Dispatch('KOMPAS.Application.7')
iApplication = KAPI7.IApplication(iApplication)
MH.iApplication = iApplication
iDocument2D = iKompasObject.ActiveDocument2D()
iDocument = iApplication.ActiveDocument
iKompasDocument2D = KAPI7.IKompasDocument2D(iDocument)
iDocument2D.ksSaveDocument("C:/Чертеж111.cdw")
В макросе обычное сохранение, можно так попробовать iDocument2D.ksSaveDocument(""), либо использовать функцию ksSaveFile.
И так ничего не делает. Я к тому, что: есть ли какие-то настройки/надстройки/модули и т.п., благодаря чему оно должно работать?
Чтобы макрос работал должен быть открыт и активен чертёж, который он должен сохранить, если активного документа нет или он другого типа, то макрос и делать ничего не должен.
Ну само собой разумеется. Ладно, спасибо, попробую на другом компьютере... Так-то не очень срочный вопрос.
Цитата: Вират Лакх от 20.06.17, 06:30:34
И так ничего не делает. Я к тому, что: есть ли какие-то настройки/надстройки/модули и т.п., благодаря чему оно должно работать?
Какая версия компаса?
16.1.10х64
Попробуйте это:
Нужно закинуть код макроса в pywin и запустить на активном чертеже именно через pywin, макрос должен прочитать штамп чертежа и компас должен вывести сообщение. Естественно в наименовании и обозначение должны быть введены какие либо данные.
# -*- coding: cp1251 -*-
from win32com.client import Dispatch
iApplication = Dispatch('KOMPAS.Application.7')
iKompasObject = Dispatch('KOMPAS.Application.5')
iDocument = iApplication.ActiveDocument
iLayoutSheets = iDocument.LayoutSheets
iLayoutSheet = iLayoutSheets.ItemByNumber (1)
iStamp = iLayoutSheet.Stamp
iText = iStamp.Text( 1 ) #номер ячейки для считывания данных
Str1 = iText.Str
iText = iStamp.Text( 2 ) #номер ячейки для считывания данных
Str2 = iText.Str
iKompasObject.ksMessage(Str1)
iKompasObject.ksMessage(Str2)
Это работает. И iDocument2D.ksSaveDocument("C:/Чертеж111.cdw") тоже работает. А из компас-макро не хочет...
Оно же не должно быть причиной не работы макроса из компаса? На видео https://www.youtube.com/watch?v=izUd-xzLvM0 этот текст есть, но макрос работает. ЦитироватьPythonWin 2.6.6 (r266:84297, Aug 24 2010, 18:13:38) [MSC v.1500 64 bit (AMD64)] on win32.
Portions Copyright 1994-2008 Mark Hammond - see 'Help/About PythonWin' for further copyright information.
>>> Traceback (most recent call last):
File "C:\Python26\Lib\site-packages\pythonwin\pywin\framework\editor\color\coloreditor.py", line 47, in OnInitialUpdate
SyntEditViewParent.OnInitialUpdate(self)
File "C:\Python26\Lib\site-packages\pythonwin\pywin\scintilla\view.py", line 213, in OnInitialUpdate
self.GetDocument().FinalizeViewCreation(self) # is there an MFC way to grab this?
File "C:\Python26\Lib\site-packages\pythonwin\pywin\framework\editor\color\coloreditor.py", line 37, in FinalizeViewCreation
self.GetDocTemplate().CheckIDLEMenus(view.idle)
File "C:\Python26\Lib\site-packages\pythonwin\pywin\framework\editor\color\coloreditor.py", line 496, in CheckIDLEMenus
keyname = pywin.scintilla.view.configManager.get_key_binding( event, ["editor"] )
File "C:\Python26\Lib\site-packages\pythonwin\pywin\scintilla\config.py", line 211, in get_key_binding
return keycodes.make_key_name( info[0], info[1] )
File "C:\Python26\Lib\site-packages\pythonwin\pywin\scintilla\keycodes.py", line 133, in make_key_name
scancode = win32api.MapVirtualKey(vk, MAPVK_VK_TO_CHAR)
AttributeError: 'module' object has no attribute 'MapVirtualKey'
win32ui.error: OnInitialUpdate() virtual handler (<bound method SyntEditView.OnInitialUpdate of <pywin.framework.editor.color.coloreditor.SyntEditView instance at 0x0000000004715108>>) raised an exception
UPD.
Усё, проблема решается сносом и установкой заново python-2.6.6.amd64
ТрындецЪ'а я уже поблагодарил.
На прошлой странице помогли сделать макрос для вставки ТТ в чертеж, в версии 17.1.1. x64 он перестал работать. Помогите, пожалуйста, найти причину неработоспособности. Макрос прилагаю.
Цитата: mikor от 20.09.17, 07:49:10
На прошлой странице помогли сделать макрос для вставки ТТ в чертеж, в версии 17.1.1. x64 он перестал работать. Помогите, пожалуйста, найти причину неработоспособности. Макрос прилагаю.
Тестируйте.
При нажатии ничего не происходит.
Вот начало кода, на очистку ТТ в активном чертеже для 17.1
Далее по этому макросу нужно получить константы 2D. Это мне не известно как, если кто подскажет буду благодарен.
#iTextLine.Align = CONST2D7.constants.ksAlignAllWidth
Здесь пайтон ругается на CONST2D7
# -*- coding: utf-8 -*-
#|Очистить технические требования активного чертежа.
import pythoncom
from win32com.client import Dispatch, gencache
import LDefin2D
import MiscellaneousHelpers as MH
# Подключим константы API Компас
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
kompas6_constants_3d = gencache.EnsureModule("{2CAF168C-7961-4B90-9DA2-701419BEEFE3}", 0, 1, 0).constants
# Подключим описание интерфейсов API5
kompas6_api5_module = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
kompas_object = kompas6_api5_module.KompasObject(Dispatch("Kompas.Application.5")._oleobj_.QueryInterface(kompas6_api5_module.KompasObject.CLSID, pythoncom.IID_IDispatch))
MH.iKompasObject = kompas_object
# Подключим описание интерфейсов API7
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
application = kompas_api7_module.IApplication(Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IApplication.CLSID, pythoncom.IID_IDispatch))
MH.iApplication = application
Documents = application.Documents
# Получим активный документ
kompas_document = application.ActiveDocument
kompas_document_2d = kompas_api7_module.IKompasDocument2D(kompas_document)
iDocument2D = kompas_object.ActiveDocument2D()
#iDocument2D.ksSaveDocument("")
iDrawingDocument = kompas_document._oleobj_.QueryInterface(kompas_api7_module.NamesToIIDMap['IDrawingDocument'], pythoncom.IID_IDispatch)
iDrawingDocument = kompas_api7_module.IDrawingDocument(iDrawingDocument)
iTechnicalDemand = iDrawingDocument.TechnicalDemand
iText = iTechnicalDemand.Text
iText.Clear()
iTechnicalDemand.Update()
Цитата: pr0100 от 20.09.17, 09:00:44
Далее по этому макросу нужно получить константы 2D. Это мне не известно как, если кто подскажет буду благодарен.
#iTextLine.Align = CONST2D7.constants.ksAlignAllWidth
Здесь пайтон ругается на CONST2D7
Я ему поправил, он говорит, что не работает.
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
это аналог CONST2D7.constants
Cоответственно:
CONST2D7 = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0)
Цитата: ТрындецЪ от 20.09.17, 09:07:36
Я ему поправил, он говорит, что не работает.
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
это аналог CONST2D7.constants
Cоответственно:
CONST2D7 = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0)
Спасибо, поправил. Теперь работает и заполняет.
Добавил в шапку макроса:
CONST2D7 = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0)
без ".constants"
И здесь еще таковая особенность старых версий с новыми,
нужно "KAPI7=kompas_api7_module" или их уровнять или заменить в коде.
Вот код:
[/code]
# -*- coding: utf-8 -*-
#|*Размеры для справок.
import pythoncom
from win32com.client import Dispatch, gencache
import LDefin2D
import MiscellaneousHelpers as MH
# Подключим константы API Компас
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
kompas6_constants_3d = gencache.EnsureModule("{2CAF168C-7961-4B90-9DA2-701419BEEFE3}", 0, 1, 0).constants
CONST2D7 = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0)
# Подключим описание интерфейсов API5
kompas6_api5_module = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
kompas_object = kompas6_api5_module.KompasObject(Dispatch("Kompas.Application.5")._oleobj_.QueryInterface(kompas6_api5_module.KompasObject.CLSID, pythoncom.IID_IDispatch))
MH.iKompasObject = kompas_object
# Подключим описание интерфейсов API7
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
application = kompas_api7_module.IApplication(Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IApplication.CLSID, pythoncom.IID_IDispatch))
MH.iApplication = application
Documents = application.Documents
# Получим активный документ
kompas_document = application.ActiveDocument
kompas_document_2d = kompas_api7_module.IKompasDocument2D(kompas_document)
iDocument2D = kompas_object.ActiveDocument2D()
#iDocument2D.ksSaveDocument("")
iDrawingDocument = kompas_document._oleobj_.QueryInterface(kompas_api7_module.NamesToIIDMap['IDrawingDocument'], pythoncom.IID_IDispatch)
iDrawingDocument = kompas_api7_module.IDrawingDocument(iDrawingDocument)
iTechnicalDemand = iDrawingDocument.TechnicalDemand
iText = iTechnicalDemand.Text
iText.Clear()
iTechnicalDemand.Update()
iTextLine = iText.Add()
iTextLine.Align = CONST2D7.constants.ksAlignAllWidth
iTextLine.IndentedLine = 0.00000000000
iTextLine.LeftEdge = 0.00000000000
iTextLine.Level = 0
iTextLine.Numbering = 1
iTextLine.RightEdge = 0.00000000000
iTextLine.StepAfterParagraph = 0.00000000000
iTextLine.StepBeforeParagraph = 0.00000000000
iTextLine.Step = 3.00000000000
iTextLine.Style = 2
iTextItem = iTextLine.Add()
iTextItem.ItemType = CONST2D7.constants.ksTItString
iTextItem.NewLine = 4096
iTextItem.Str = '*Размеры для справок.'
iTextItem.SymbolFontName = ''
iTextFont = iTextItem._oleobj_.QueryInterface(kompas_api7_module.NamesToIIDMap['ITextFont'], pythoncom.IID_IDispatch)
iTextFont = kompas_api7_module.ITextFont(iTextFont)
iTextFont.Bold = False
iTextFont.Color = 0
iTextFont.FontName = 'GOST type A'
iTextFont.Height = 5.00000000000
iTextFont.Italic = True
iTextFont.Underline = False
iTextFont.WidthFactor = 1.00000000000
iTextItem.Update()
iTechnicalDemand.Update()
По коду макроса, который приложил, для тех кто не силен в программировании:
Там где:
iTextItem.Str = '*Размеры для справок.'
Чтобы не размножать код на получение параметров шрифта.
Там если необходимо указать несколько строк нужно сделать переход на следующую строку добавлять следующую комбинацию: '\n'
То есть чтобы в ТТ было
1 *Размеры для справок.
2 Неуказанные предельные отклонения
Нужно в строке прописать:
iTextItem.Str = '*Размеры для справок.\nНеуказанные предельные отклонения' и т.д.
А как в ТТ после номеров пункта поставить точку?
Смотрим вложение.
Цитата: KiDim от 02.09.22, 15:03:11Смотрим вложение.
Полагаю речь, о том, как в коде ее поставить. Я так и не придумал. Просто начинал каждый новый пункт с точки. Или использовал настроенный шаблон чертежа.
ЦитироватьПолагаю речь, о том, как в коде ее поставить
Именно так...
Плохо что не настроить программно
Извиняюсь, не обратил внимание на название темы...
Цитата: fdbir от 05.09.22, 07:40:06Плохо что не настроить программно
Да можно наверняка, просто nocode способ всегда спасал. А вообще мне нормоконтроль выдержку из ЕСКД показывал и пояснял, что допускается и с . и без.))
Цитата: graphdark от 06.09.22, 08:40:18Да можно наверняка, просто nocode способ всегда спасал. А вообще мне нормоконтроль выдержку из ЕСКД показывал и пояснял, что допускается и с . и без.))
Вся проблема в том что при заполнении ТТ в ручную точки ставит (все параметры настроены). А вот при программном заполнении точки ни как не хочет ставить. Что там надо указать не понятно))
Цитата: fdbir от 07.09.22, 13:23:00Вся проблема в том что при заполнении ТТ в ручную точки ставит (все параметры настроены). А вот при программном заполнении точки ни как не хочет ставить. Что там надо указать не понятно))
Ну вот попробуйте пустой чертеж настроить ТТ и в нем новые пункты через апи писать. Мне так работало.