Как найти все тексты текущего документа

Автор Борис_С, 11.03.19, 14:56:52

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

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

Борис_С

Всем доброго дня.
Мне нужно найти все тексты текущего документа.
Подскажите, пожалуйста, как это сделать?


Борис_С

Для получения IDrawingTexts мне нужен интерфейс IKompasDocument2D.
Я работаю в Automation. Как я могу получить этот интерфейс из интерфейса ksDocument2D?
+ Благодарностей: 1

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

Борис_С

Получил интерфейс IDrawingTexts.
У него только одно свойство - DrawingText - Текст на чертеже, заданный по индексу.
А как определить количество таких текстов?
Для интерфейса IDrawingText среди перечня свойств нет свойства содержание текста, которое мне нужно.
Как его найти?


Борис_С

С количеством понятно, а как насчет содержания?

Получаете IDrawingText и разгребаете его на составляющие, текст объект сложный, как его разобрать на запчасти, примеры есть на форуме.

Борис_С

Ничего сложного. М.б. кому-нибудь пригодится. Код прилагаю.

var
  komDoc: IKompasDocument;
  komDoc2D: IKompasDocument2D;
  komDoc2D1: IKompasDocument2D1;
  kompas: KompasObject;
  Kompas7: IApplication;
  Doc: ksDocument2D;
  i: Integer;
  pViews: IViews;
  pView: IView;
  pDrawingContainer: IDrawingContainer;
  pViewsAndLayersManager : IViewsAndLayersManager;
  pDrawingTexts: IDrawingTexts;
  pDrawingText: IDrawingText;
  pText: IText;
  FileName, sText: string;
begin
    Doc := ksDocument2D(kompas.Document2D); //Получаем интерфейс документа
    Doc.ksOpenDocument(FileName, false);
    Doc.ksZoomPrevNextOrAll(2);
    komDoc2D := Kompas7.ActiveDocument As IKompasDocument2D;
    if komDoc2D <> nil then
    begin
      // Получаем менеджер для работы с видами и слоями
      pViewsAndLayersManager := komDoc2D.ViewsAndLayersManager;
      if ( pViewsAndLayersManager <> nil ) then
      begin
        // Получаем коллекцию видов
        pViews := pViewsAndLayersManager.Views;
        //pViews := GetViews();
        if (pViews <> nil) then
        begin
          // Получаем текущий вид
          pView := pViews.ActiveView;
          if (pView <> nil) then
          begin
            // получаем указатель на контейнер графических объектов
            pDrawingContainer := pView As IDrawingContainer;
            if (pDrawingContainer <> nil) then
            begin
              pDrawingTexts := pDrawingContainer.DrawingTexts;
              if (pDrawingTexts <> nil) then
              begin
                for i := 0 to pDrawingTexts.Count - 1 do
                begin
                  pDrawingText := pDrawingTexts.DrawingText[i];
                  pText := pDrawingText as IText;
                  if pText <> nil then
                  begin
                    sText := pText.Str;  // текст в виде строки
                  end;
                end;
              end;
            end;
          end;
        end;
      end;
    end;
end;

Slaviation

Добрый день.
ЦитироватьМне нужно найти все тексты текущего документа.
Если под "все тексты "имеются в виду только тексты, созданные командой "Надпись" (см. text.png)? то можно ограничиться разбором контейнера IDrawingTexts.
Если же имеются в виду все тексты вообще ( + тексты в таблицах, размерах, условных обозначениях, технических требованиях и т..д), то разбора контейнера IDrawingTexts будет недостаточно.
+ Благодарностей: 1

Борис_С

Я нашел в документе все тексты. Мне нужно выделить один из них.
У меня есть интерфейсы IDrawingText и IText по выбранному тексту.
Как выделить этот текст?

Добавить указатель текста в нулевую группу, т.е. группу селектирования.

Slaviation

quote]Я нашел в документе все тексты. Мне нужно выделить один из них.
У меня есть интерфейсы IDrawingText и IText по выбранному тексту.
Как выделить этот текст?[/quote]
Пример во вложении.
+ Благодарностей: 1

Борис_С


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

Борис_С


Vitalij Lysanov

#16
Цитата: Slaviation от 14.03.19, 09:25:06
quote]Я нашел в документе все тексты. Мне нужно выделить один из них.
У меня есть интерфейсы IDrawingText и IText по выбранному тексту.
Как выделить этот текст?
Пример во вложении.


С таким кодом конечно легче с текстами работать. Можно многострочный текст в строку расположить.

Давно искал уникальные тексты по чертежу, применил приведенный в приложении код.

Получилось так

  # -*- coding: utf-8 -*-
#~ https://forum.ascon.ru/index.php/topic,32181.msg261017.html#msg261017

import numpy as np

import pythoncom
from win32com.client import Dispatch, gencache, VARIANT
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))
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
kompas_api_object = kompas_api7_module.IKompasAPIObject(Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IKompasAPIObject.CLSID, pythoncom.IID_IDispatch))
application = kompas_api_object.Application
kompas_document = application.ActiveDocument
kompas_document_2d = kompas_api7_module.IKompasDocument2D(kompas_document)
kompas_document_2d1 = kompas_api7_module.IKompasDocument2D1(kompas_document_2d)
selection_manager = kompas_document_2d1.SelectionManager
views_and_layers_manager = kompas_document_2d.ViewsAndLayersManager
views = views_and_layers_manager.Views
view = views.ActiveView
drawing_container = kompas_api7_module.IDrawingContainer(view)
drawing_texts = drawing_container.DrawingTexts
n=0


m=[]


for index in range(drawing_texts.Count):

    n=n+1
    print (n)

    drawing_text = drawing_texts.Item(index)



    selection_manager.Select(drawing_text)



    t= kompas_api7_module.IText(drawing_text).Str
    t = t.replace('\n', ' ')
    m.append(t)



m_np=np.array(m)
m_np_sort=np.sort(m_np, axis=0)

un=np.unique(m_np_sort)


for v in un:
    print ("")
    print (v)
 



И пример части вывода программы по электрической схеме.

2КТП-3-1600/6/0,4

2КТП-4-1000/6/0,4

2КТП-5-1600/6/0,4

2КТП-6-400/6/0,4

2КТП-630/6/0,4-10,11

2КТП-7 Ввод №1

2КТП-7 Ввод №2

2КТП-7-630/6/0,4

2КТП-ГСМ-1000/6/0,4

2КТП-ГСМ-2-1000/6/0,4кВ

2КТП-СН-630/6/0,4



Хорошо когда умеешь хотя бы готовые макросы запускать.

Столько интересного о своем документе можно узнать

http://www.world-art.ru/lyric/lyric.php?id=6911





Борис_С

А как все-таки найти тексты в таблицах, штампах, размерах, условных обозначениях, технических требованиях и т..д?

Принцип тот же, находите все таблицы, штампы, размеры, условные обозначения, технические требования и т..д, а потом получаете от них тексты.

Борис_С

У меня есть многострочный текст. Могу я выделить не весь текст, а только одну строку этого текста? Если да, то как?