Получить текст из "Надпись" на чертеже

Автор GRG, 22.01.23, 20:03:34

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

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

GRG

Кто может помочь с макросом под Компас 2Д, на Python? Суть "прощелкать" тексты  на чертеже типа "Надпись" и сохранить их в Эксель.
Работает примерно так:
Запустил макрос, в диалоговом окне выбрал заготовленный файл эксель, в ячейке А1 которого есть число, сколько столбцов будет в цикле. начинается вставка с 3 строки (место остается под заголовки).
дальше прощелкал мышкой тексты на чертеже подряд, выход из макроса (цикла) esc.  на пример нужно 4 столбца (для цикла).  Значит в эксель в ячейке А1 укажу  4.
По сути это заполнение кабельного журнала из существующей схемы соединений в компасе. Чтобы вручную не копировать.
Тексты вставлять научился, по списку из Эксель тоже. Если интересно https://disk.yandex.ru/d/ux_pmIOeekJCMQ. По сути это обратные этим макросам задачи.
Получить текст выделенной надписи не получается.
Может кто подскажет код? Или возьмется за написание?



Toptotal

Если Компас не может  создавать журнал кабелей, то не хрен в нем это делать..
Я так понимаю номер кабеля и номер контакта на разьеме?

dimak222

Цитата: GRG от 22.01.23, 20:03:34Кто может помочь с макросом под Компас 2Д, на Python?
Получение выделенного текста из чертежа.zip и код:
def KompasAPI(): # подключение API компаса

    import pythoncom # модуль для запуска без IDLE
    from win32com.client import Dispatch, gencache # библиотека API Windows

    global KompasAPI7 # значение делаем глобальным
    global iApplication # значение делаем глобальным

    KompasAPI7 = gencache.EnsureModule('{69AC2981-37C0-4379-84FD-5DD2F3C0A520}', 0, 1, 0) # API7 КОМПАСа
    iApplication = Dispatch('Kompas.Application.7') # интерфейс приложения КОМПАС-3D.

def Read_text(iSelectedObject): # прочитаем выделеный текст

    if iSelectedObject: # если выделено
        if iSelectedObject.DrawingObjectType == 4: # если это текст
            iDrawingText = iDrawingTexts.DrawingText(iSelectedObject.Reference) # интерфейс текста на чертеже
            iText = KompasAPI7.IText(iDrawingText) # интерфейс текста
            print(iText.Str)
    else: # не выделено
        print("Выделите текст!")

KompasAPI() # подключение API компаса

iKompasDocument = iApplication.ActiveDocument # получить текущий активный документ

iKompasDocument2D = KompasAPI7.IKompasDocument2D(iKompasDocument) # базовый класс графических документов КОМПАС

iViewsAndLayersManager = iKompasDocument2D.ViewsAndLayersManager # менеджер слоев и видов графического документа
iViews = iViewsAndLayersManager.Views # интерфейс коллекции видов графического документа
iView = iViews.ActiveView # интерфейс вида графического документа

iDrawingContainer = KompasAPI7.IDrawingContainer(iView) # интерфейс контейнера объектов вида графического докумен
iDrawingTexts = iDrawingContainer.DrawingTexts # указатель на интерфейс коллекции текстов на чертеже

iKompasDocument2D1 = KompasAPI7.IKompasDocument2D1(iKompasDocument) # дополнительный интерфейс IKompasDocument2D

iSelectionManager = iKompasDocument2D1.SelectionManager # менеджер выделенных объектов
iSelectedObjects = iSelectionManager.SelectedObjects # массив выделенных объектов в виде SAFEARRAY | VT_DISPATCH

if isinstance(iSelectedObjects, tuple): # если выбрано несколько объектов (кортеж объектов)
    for iSelectedObject in iSelectedObjects: # перебор всех выделеных объектов
        Read_text(iSelectedObject) # прочитаем выделеный текст
else:  # если выбран один объект
    iSelectedObject = iSelectedObjects # если один объект
    Read_text(iSelectedObject) # прочитаем выделеный текст
+ Благодарностей: 1

Вират Лакх

import pythoncom # модуль для запуска без IDLE
Что за запуск без IDLE? Если вы его не используете, то и не надо импортировать. IDLE тут не при делах.

dimak222

Цитата: Вират Лакх от 24.01.23, 09:25:54Что за запуск без IDLE?
Точнее IDE (PyScripter/PyCharm), похоже кочует опечатка из одного в другое. У меня, если запускать двойным кликом (через python.exe) макрос, он не работает пока не добавишь этот модуль. Если использовать среду разработки (PyScripter/PyCharm), тогда согласен, он не нужен. Раньше его не добавлял, но есть кто запускает через python.exe.

P.S. Допилил пересохранялку (KSaver) из папки, сейчас тестирую её на ошибки.

GRG


GRG

import pythoncom
import win32com
from win32com.client import Dispatch, gencache
import win32api, time
import LDefin2D
import MiscellaneousHelpers as MH

from tkinter import filedialog
from tkinter import *
import tkinter as tk





#  Подключим константы 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()
'''

#
'''
Excel = win32com.client.Dispatch("Excel.Application")
wb = Excel.Workbooks.Open(u'V:\po spisku export.xlsx') #ximport
sheet = wb.ActiveSheet
val = sheet.Cells(1,2).value
print(val)

def Exp11():
    sheet.Cells(1,1).value = iText2

def Kopi():
    def KompasAPI(): # подключение API компаса

        import pythoncom # модуль для запуска без IDLE
        from win32com.client import Dispatch, gencache # библиотека API Windows
        global KompasAPI7 # значение делаем глобальным
        global iApplication # значение делаем глобальным

        KompasAPI7 = gencache.EnsureModule('{69AC2981-37C0-4379-84FD-5DD2F3C0A520}', 0, 1, 0) # API7 КОМПАСа
        iApplication = Dispatch('Kompas.Application.7') # интерфейс приложения КОМПАС-3D.

    def Read_text(iSelectedObject): # прочитаем выделеный текст
        if iSelectedObject: # если выделено
            if iSelectedObject.DrawingObjectType == 4: # если это текст
                iDrawingText = iDrawingTexts.DrawingText(iSelectedObject.Reference) # интерфейс текста на чертеже
                iText = KompasAPI7.IText(iDrawingText) # интерфейс текста
                print(iText.Str) #действие от копирования ----
                iText2 = iText.Str
                return(iText2)
                Exp11()
               
        else: # не выделено
            print("Выделите текст!")

    KompasAPI() # подключение API компаса

    iKompasDocument = iApplication.ActiveDocument # получить текущий активный документ

    iKompasDocument2D = KompasAPI7.IKompasDocument2D(iKompasDocument) # базовый класс графических документов КОМПАС

    iViewsAndLayersManager = iKompasDocument2D.ViewsAndLayersManager # менеджер слоев и видов графического документа
    iViews = iViewsAndLayersManager.Views # интерфейс коллекции видов графического документа
    iView = iViews.ActiveView # интерфейс вида графического документа

    iDrawingContainer = KompasAPI7.IDrawingContainer(iView) # интерфейс контейнера объектов вида графического докумен
    iDrawingTexts = iDrawingContainer.DrawingTexts # указатель на интерфейс коллекции текстов на чертеже

    iKompasDocument2D1 = KompasAPI7.IKompasDocument2D1(iKompasDocument) # дополнительный интерфейс IKompasDocument2D

    iSelectionManager = iKompasDocument2D1.SelectionManager # менеджер выделенных объектов
    iSelectedObjects = iSelectionManager.SelectedObjects # массив выделенных объектов в виде SAFEARRAY | VT_DISPATCH

    if isinstance(iSelectedObjects, tuple): # если выбрано несколько объектов (кортеж объектов)
        for iSelectedObject in iSelectedObjects: # перебор всех выделеных объектов
            Read_text(iSelectedObject) # прочитаем выделеный текст
           
    else:  # если выбран один объект
        iSelectedObject = iSelectedObjects # если один объект
        Read_text(iSelectedObject) # прочитаем выделеный текст

# Нажатие и отпускание  кнопки
while True:
    a = win32api.GetKeyState(0x01) # 0x02 правая / 0x01 левая
    b = win32api.GetKeyState(0x1B) # ESC key
    if a < 0:
        print("нажата")
        time.sleep(0.1) # Сон в секунды
        Kopi() #обработка выделенного
    time.sleep(0.1) # Сон в секунды
    if b < 0:
        print("ESC key")
        break #стоп

GRG

вот только почему то данные не записываются в эксель

dimak222

Цитата: GRG от 26.02.23, 23:38:23....
iText2 = iText.Str
return(iText2)
Exp11()
....
Вот тут ошибка, потому что, "return" заканчивает действие функции (должен быть всегда последним).

Доработал макрос:
1. Убрал лишнее, подключение к КОМПАСу вынес из цикла.
2. Теперь не должно быть ошибок при выделении других объектов (не текст).
3. Исправил ошибку считывания текста если он на другом виде.
4. Можно работать с документами в разных вкладках (не нужно перезапускать макрос если нужно копировать с другого файла).

P.S. Результат работы оставил как был. Для работы макроса нужно прописать полный путь к Exel файлу.
+ Благодарностей: 1