Не работает записанный макрос

Автор mikor, 30.01.17, 07:55:53

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

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

mikor

Справку я прочитал, заметил пункты:

– таблица на чертеже,
– текст,
– технические требования

Но не обратил внимание на "Объекты, создание которых может быть записано в макрос". Думал, что и редактировать можно.

Алхимик

Компас-Макро да, но можно SDK читать. Или на форуме полазить.

Вообще если не лесть в настройки текущего чертежа, то изменяю высоту шрифтов просто выделив объекты и в свойствах изменяю значения для них скопом. Пример: Изменения длины выбранных отрезков. Недостаток: новые объекты будут иметь формат заложенный в чертеж.

Вират Лакх

Для спортивного интереса записал макрос типа как тут: 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")

20.06.17, 06:09:42 #23 Последнее редактирование: 20.06.17, 06:30:00 от Sabahs
В макросе обычное сохранение, можно так попробовать iDocument2D.ksSaveDocument(""), либо использовать функцию ksSaveFile.

Вират Лакх

И так ничего не делает. Я к тому, что: есть ли какие-то настройки/надстройки/модули и т.п., благодаря чему оно должно работать?

Чтобы макрос работал должен быть открыт и активен чертёж, который он должен сохранить, если активного документа нет или он другого типа, то макрос и делать ничего не должен.

Вират Лакх

Ну само собой разумеется. Ладно, спасибо, попробую на другом компьютере... Так-то не очень срочный вопрос.

pr0100

Цитата: Вират Лакх от 20.06.17, 06:30:34
И так ничего не делает. Я к тому, что: есть ли какие-то настройки/надстройки/модули и т.п., благодаря чему оно должно работать?


Какая версия компаса?

Вират Лакх


pr0100

Попробуйте это:
Нужно закинуть код макроса в 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") тоже работает. А из компас-макро не хочет...

Вират Лакх

29.08.17, 09:33:12 #31 Последнее редактирование: 29.08.17, 11:57:36 от Вират Лакх
Оно же не должно быть причиной не работы макроса из компаса? На видео 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
ТрындецЪ'а я уже поблагодарил.

mikor

20.09.17, 07:49:10 #32 Последнее редактирование: 20.09.17, 08:05:12 от mikor
На прошлой странице помогли сделать макрос для вставки ТТ в чертеж, в версии 17.1.1. x64 он перестал работать. Помогите, пожалуйста, найти причину неработоспособности. Макрос прилагаю.

ТрындецЪ

Цитата: mikor от 20.09.17, 07:49:10
На прошлой странице помогли сделать макрос для вставки ТТ в чертеж, в версии 17.1.1. x64 он перестал работать. Помогите, пожалуйста, найти причину неработоспособности. Макрос прилагаю.
Тестируйте.

mikor

При нажатии ничего не происходит.

pr0100

Вот начало кода, на очистку ТТ в активном чертеже для 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)
+ Благодарностей: 1

pr0100

20.09.17, 09:19:13 #37 Последнее редактирование: 20.09.17, 09:43:36 от pr0100
Цитата: ТрындецЪ от 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Неуказанные предельные отклонения' и т.д.

+ Благодарностей: 1

fdbir

А как в ТТ после номеров пункта поставить точку?

KiDim

Смотрим вложение.