Форум пользователей ПО АСКОН

Профессиональные вопросы => Программирование приложений => Python и КОМПАС-Макро => Тема начата: Alal от 26.03.16, 09:13:20

Название: Обучение программированию
Отправлено: Alal от 26.03.16, 09:13:20
Подскажите где найти литературу для самостоятельного обучения программированию для компаса на питоне? Я не программист, но ручками рисовать целый день то, что можно автоматизировать, уже надоело. Помогите, не знаю с чего начать.
Название: Re: Обучение программированию
Отправлено: Алхимик от 26.03.16, 09:42:58
На пайтоне вроде ничего нет, есть книжка:
"Разработка приложений под КОМПАС в Delphi"

+ есть SDK если у вас есть опыт работы с Python, то может и этой справки хватить.

ну а так можно или задавать конкретный вопрос на форуме или посмотреть какие макаросы пишут тут (https://vk.com/topic-29994774_26653498?offset=160) самоучки-инженеры. Там нет С++ и Delphi. Только VBA и Python.
Название: Re: Обучение программированию
Отправлено: Alal от 26.03.16, 11:00:34
Спасибо. Еще подскажите, где-нибудь встречаются примеры макросов с подробными комментариями кода? Или описание библиотек, которые используются в питоне. К примеру, я вижу функцию iDocument2D.ksLineSeg в одном из примеров, как мне узнать, что она делает?
Заранее извиняюсь, если эти вопросы кажутся глупыми, но пока знаний никаких... 
Название: Re: Обучение программированию
Отправлено: Sabahs от 26.03.16, 11:14:59
Запустить справку SDK, вести ksLineSeg и почитать.
Название: Re: Обучение программированию
Отправлено: Николай от 28.03.16, 08:12:39
Алхимик, по ссылке "тут" ничего нет...
Название: Re: Обучение программированию
Отправлено: Алхимик от 28.03.16, 09:07:59
Там ссылка на группу в ВК и тему по созданию пару макросов. Но там особо серьезных туторов нет.
Название: Re: Обучение программированию
Отправлено: Alal от 28.03.16, 12:06:21
Алхимик, спасибо большое за отправную точку. Делай побольше видео с описанием кода, буду следить за тобой на ютубе.
Название: Re: Обучение программированию
Отправлено: СВ от 28.03.16, 13:37:23
Цитата: Alal от 26.03.16, 09:13:20
... Я не программист, но ручками рисовать целый день то, что можно автоматизировать, уже надоело. ...
Если можно, расскажите, кто Вы по сути:
- конструктор, который способен программировать;
- программист, которому приходится конструировать?
В какой области Вы работаете; часто ли встречаются в работе повторяющиеся детали, элементы?
Название: Re: Обучение программированию
Отправлено: Алхимик от 28.03.16, 14:02:26
Цитата: СВ от 28.03.16, 13:37:23
- конструктор, который способен программировать;
- программист, которому приходится конструировать?
В какой области Вы работаете; часто ли встречаются в работе повторяющиеся детали, элементы?
Что вам даст ответы на эти вопросы?

ПС  судя по тому что пишется в теме и по названию, это не программист.
ПС2 программирование может помочь во многом, вот там по ссылке в ВК, люди буквально за неделю смогли написать норм макрос. Который будет пересчитывать гибы, макрос на создания текста в таблице (за вечер).

Вот нужно человеку два дня потратить на заполнение таблиц, а он за 5 часов написал макрос с нуля и заполнил таблицу за 1 минуту. А если маленькая контора и сроки горят, тогда и начальник еще наградит.
Название: Re: Обучение программированию
Отправлено: СВ от 28.03.16, 14:59:54
 Сергей Павлович, я очень рад, что помог пристроить этот "элемент производственного юмора", но вопрос всё-таки не снимается.
Название: Re: Обучение программированию
Отправлено: n00ze от 28.03.16, 17:07:59
Цитата: СВ от 28.03.16, 14:59:54
Сергей Павлович, я очень рад, что помог пристроить этот "элемент производственного юмора", но вопрос всё-таки не снимается.
я тоже не очень понимаю зачем вопрос. с помощью правильного макроса можно многое автоматизировать.. Почти все если быть точным) Один мой друг - хороший программист говорит - я вот иногда мечтаю, стать офисным работником. Написать кучу программ и ничего не делать в  целыми днями. И я готов с ним согласиться, что это возможно.
Название: Re: Обучение программированию
Отправлено: СВ от 28.03.16, 17:22:46
 Сергей Павлович, n00ze,  ВСЁ-ТАКИ, я могу спросить у Alalа что мне нужно, или нет?
Название: Re: Обучение программированию
Отправлено: Alal от 29.03.16, 08:17:48
СВ, конечно можете спросить! :)
Я инженер-проектировщик, занимаюсь в основном проектированием наружных инженерных коммуникаций. Специальность ПГС. На программиста не учился и программированием не занимался.
Организация у нас маленькая, работа разнообразная, поэтому специализированного программного обеспечения нет. При проектировании сетей возникает куча работы, которую на мой взгляд можно и нужно автоматизировать. К примеру, сеть водоснабжения поселка длиной 10 км может состоять из >500 отдельных участков. На каждом участке должны быть указаны его длина и обозначение трубы. Работа может выполняться за секунду, но занимает часа три. И таких примеров много. Из-за этого проектирование превращается в конвейер с кучей маленьких элементов чертежа.
При необходимости, сделать маленькую программку, для меня никогда не было проблемой. Но научить, что-то делать компас для меня оказалось проблемой. Сходу не осилил, поэтому пришел сюда за помощью.
Название: Re: Обучение программированию
Отправлено: Slaviation от 29.03.16, 08:42:04
Alal, предлагаю такой roadmap

1.
Нужно установить Python и его расширение Pywin32
для x86
https://www.python.org/ftp/python/2.7.9/python-2.7.9.msi
http://sourceforge.net/projects/pywin32/files/pywin32/Build%20219/pywin32-219.win32-py2.7.exe/download
для x64
https://www.python.org/ftp/python/2.7.9/python-2.7.9.amd64.msi
http://sourceforge.net/projects/pywin32/files/pywin32/Build%20219/pywin32-219.win-amd64-py2.7.exe/download

2. Почитать об основах программирования на Python. Если совсем нет времени на это, то иметь под рукой
удобный cheat sheet, к примеру http://www.cheatography.com/davechild/cheat-sheets/python/pdf/

3. В качестве исходного примера можно использовать файл из вложения start_step.pyw, в котором реализовано полуение
интерфейсов к обеим версиям api КОМПАС и к используемым константам КОМПАС.
i_kompas_api_object - Базовый объект КОМПАС API IKompasAPIObject (api версии 7)
kompas_object - KompasObject - Интерфейс API КОМПАС (api версии 5)
Использовать можно любую версию api или обе сразу. Каждая версия покрыает свою часть функционала
КОМПАС (так наверное сложилось исторически:)

4. Пользуясь справкой по SDK КОМПАС (SDK.chm) начать пробовать получать дочерние от IKompasAPIObject или KompasObject интерфейсы,
использовать их свойства и методы, продвигаться к решению поставленной задачи.

5. Заглядывать в обучающие примеры в каталогах
C:\Program Files\ASCON\KOMPAS-3D V16\SDK\C++\VisualcAUTO\
или в
C:\Program Files\ASCON\KOMPAS-3D V16\SDK\Pascal\DELPHIAUTO\
хоть они и не на Python.
Название: Re: Обучение программированию
Отправлено: Alal от 30.03.16, 09:15:39
Подскажите, если я в активном 2D документе выделяю несколько отрезков и хочу узнать координаты их начальных и конечных точек, как мне это сделать? В SDK смотрел, но не могу найти нужные мне методы, как я их вижу.
Если не сложно, желательно показать на примере в питоне или на край в паскале, синтаксис С, бейсика и тд совсем не понимаю

PS Еще раз говорю, ничем таким не занимался, поэтому все для меня туго для понимания. Не глумитесь  :)
Название: Re: Обучение программированию
Отправлено: Alal от 30.03.16, 09:30:18
Такие методы как ksLineSegParam и GetParamStruct я нашел, но как работать именно с выделенными объектами?
Название: Re: Обучение программированию
Отправлено: Алхимик от 30.03.16, 09:35:49
Самому интересно, тут наверное ответят более конкретно.

В группе ВК был макрос от одного программиста АСКОН, который разукрашивал выбранные грани, можно там посмотреть как происходил выбор. Посмотреть сейчас не могу ВК, но помнится где то в начале темы про макросы.
Название: Re: Обучение программированию
Отправлено: Alal от 30.03.16, 09:42:36
Точно! помню такое, ничего тогда не понял, просто пролистал. Надо пересмотреть.

Сегодня пришел на работу, написал одну строчку, и до сих пор сижу довольный:
Название: Re: Обучение программированию
Отправлено: pr0100 от 30.03.16, 10:51:45
Обучение, обучением, а вот исходников закоментированных мало выкладывается
Название: Re: Обучение программированию
Отправлено: Alal от 30.03.16, 11:33:43
Вот тот макрос с выделение, есть у кого подобное с 2D объектами?


#!/usr/bin/python
# -*- coding: cp1251 -*-
# |change color

import Kompas10API5 as KAPI
from win32com.client import Dispatch
import LDefin2D
import LDefin3D

iKompasObject = Dispatch('KOMPAS.Application.5')
iKompasObject = KAPI.KompasObject(iKompasObject)
iDocument3D = iKompasObject.ActiveDocument3D()

SlcMan = iDocument2D.GetSelectionMng()
Count = SlcMan.GetCount()
n=0
Face0 = SlcMan.GetObjectByIndex (0)
ColorFace0 = Face0.ColorParam()
color0 = ColorFace0.color
for n in range(0,Count,1):
   Face = SlcMan.GetObjectByIndex (n)
   ColorFace = Face.ColorParam()
   color = ColorFace.color
   ColorFace.color = color0
   Face.Update ()
SlcMan.UnselectAll ()   
Название: Re: Обучение программированию
Отправлено: Slaviation от 31.03.16, 10:10:25
ЦитироватьПодскажите, если я в активном 2D документе выделяю несколько отрезков и хочу узнать координаты их начальных и конечных точек, как мне это сделать? В SDK смотрел, но не могу найти нужные мне методы, как я их вижу.
Если не сложно, желательно показать на примере в питоне или на край в паскале, синтаксис С, бейсика и тд совсем не понимаю

PS Еще раз говорю, ничем таким не занимался, поэтому все для меня туго для понимания. Не глумитесь

Пример в прицепе.
В примере нет проверок на наличие/отсутствие чего-либо, поэтому откройте в КОМПАС чертеж, выделите несколько объектов, среди которых есть отрезки.
В проводнике встаньте на файл test.pyw, вызовите контекстное меню, выберите пункт "Edit with IDLE" или "Edit with Pythonwin", после того как код примера откроется в редакторе нажмите F5.
Координаты отрезков будут выведены в интерактивное окно редактора.
Название: Re: Обучение программированию
Отправлено: Алхимик от 31.03.16, 11:02:25
if isinstance(selected_objects, tuple): #  выделяю несколько
    for object in selected_objects:
        if object.DrawingObjectType is not  const.ksDrLineSeg: # отрезков
            continue
        line_segment = module.ILineSegment(object)
        print "x1: ", line_segment.X1, " y1: ",  line_segment.Y1 # хочу узнать координаты их начальных и конечных точек
        print "x2: ", line_segment.X2, " y1: ",  line_segment.Y2
        print "Length: ", line_segment.Length
        print "Angle: ", line_segment.Angle
        print "---"   

Добавил 2 строки, интересно работает. Длины и угла.

Для чего вы добавили "tuple" - кортеж?
По какому принципу определяется последовательность отрезков с которых считываем данные? Random?
Название: Re: Обучение программированию
Отправлено: Slaviation от 31.03.16, 11:11:32
ЦитироватьДля чего вы добавили "tuple"
if isinstance(selected_objects, tuple): - это проверка того, что selected_objects является кортежем, т.е. что было селектировано более одного объекта.
Если был выделен один объект, то selected_objects это он и есть.

ЦитироватьПо какому принципу определяется последовательность отрезков с которых считываем данные? Random?
Не знаю, ответ наверное нужно искать в реализации ISelectionManager.
Название: Re: Обучение программированию
Отправлено: Алхимик от 31.03.16, 12:04:38
Цитата: Slaviation от 31.03.16, 11:11:32
Искать в реализации ISelectionManager.
Из-за этого пункта у нас получается кортеж? А не просто список. Хотел установить для отрезков длинной больше 50мм стиль - тонкая. Ошибка не выводится, но и ничего и не изменяется.

В общем - матчасть наше все 88))
Название: Re: Обучение программированию
Отправлено: Slaviation от 31.03.16, 13:46:51
ЦитироватьХотел установить для отрезков длинной больше 50мм стиль - тонкая. Ошибка не выводится, но и ничего и не изменяется.
В прицепе пример, в котором меняется стиль линии на "тонкая" у селектированных отрезков длинной более 50 мм.
Название: Re: Обучение программированию
Отправлено: Алхимик от 31.03.16, 14:24:18
Т.е. до "Update" у нас просто идет чтение нужной информации Пайтоном с Компаса? Очень интересно :shu:
Название: Re: Обучение программированию
Отправлено: Алхимик от 07.04.16, 13:46:50
Получается мы сначала выбираем в каком документе мы хотим работать. И потом поиском связываем концы?

Пока не вижу иерархии или ее там нет и это "словарь" с понятиями и определениями?

Для примера чтобы использовать свойства печати, необходимо так делать? Код не обязателен, нужна удочка, а не рыбка 88))
Название: Re: Обучение программированию
Отправлено: Алхимик от 07.04.16, 13:56:04
Смотрю внимательней, а тут еще и такой интерфейс есть... мне не нужно ничего печатать, иллюстрации как пример,  бывает какая то задвоенность( интерфейсов и методов((
Название: Re: Обучение программированию
Отправлено: ТрындецЪ от 16.02.17, 15:52:20
Как в Python'е получить коллекцию точек чертежа и потом выделить часть из них, чьи координаты удовлетворяют какому-то условию.
Знаю, что через свойство Points интерфейса IDrawingContainer, но не могу добраться до него. В SDK путаюсь.
Название: Re: Обучение программированию
Отправлено: Vitalij Lysanov от 16.02.17, 16:16:10
Код из примеров библиотеки Pik10 должен помочь:

# coding: cp1251
# 2D-API|step3

Kompas, doc2d = start2d()
import Kompas6API5, LDefin2D

example = 10
read(example='3.Пример')

if example in (10,0):       # Cоздать точку
    # Cтиль отрисовки точки
    # 0-точка, 1-крестик, 2-х-точка, 3-квадрат, 4-треугольник, 5-окружность, 6-звезда,
    # 7-перечеркнутый квадрат

    doc2d.ksMtr( 10, 10, 0, 1, 1 )              # Матрица преобразования координат ( 10 по оси OX, 10 по оси OY )
    p = doc2d.ksPoint( 30, 40, 0 )              # Создать точку

    doc2d.ksPoint( 40, 40, 1 )
    doc2d.ksPoint( 50, 40, 2 )
    doc2d.ksPoint( 60, 40, 3 )
    doc2d.ksPoint( 70, 40, 4 )
    doc2d.ksPoint( 80, 40, 5 )
    doc2d.ksPoint( 90, 40, 6 )
    doc2d.ksPoint( 100,40, 7 )

    doc2d.ksDeleteMtr()                         # Отключение матрицы преобразования координат

   # Взять параметры точки
    par = Kompas6API5.ksPointParam(Kompas.GetParamStruct( LDefin2D.ko_PointParam ))

    t = doc2d.ksGetObjParam( p, par, LDefin2D.ALLPARAM )    # Взять параметры точки

    out =["t = ", t, " x = ", par.x, " y = ", par.y, " style = ", par.style]
    Kompas.ksMessage( ' '.join( map( unicode, out ) ) )      # Вывод

    # Задать параметры окружности
    par.x = 20                                # Координаты точки
    par.y = 30
    par.style = 7                             # Cтиль отрисовки точки

    if doc2d.ksSetObjParam( p, par, LDefin2D.ALLPARAM ):        # Заменить параметры точки
        Kompas.ksMessage( "Изменили объект")
    else:
        Kompas.ksMessageBoxResult()               # Выдать сообщение об ошибке на экран

    par = None




Название: Re: Обучение программированию
Отправлено: ТрындецЪ от 16.02.17, 16:23:38
Спасибо за ответ! А что это за библиотека Pik10? Может там ещё чего полезного для новичков имеется?
Название: Re: Обучение программированию
Отправлено: Vitalij Lysanov от 16.02.17, 18:51:19

Библиотека Pik10 шла к Компасу 8 или 9.

https://yadi.sk/d/u3UR4BJqrYavH

https://yadi.sk/d/9W2kwhxxuie68

Название: Re: Обучение программированию
Отправлено: tramp_m от 16.02.17, 21:08:00
На сколько мне известно, вроде как бы на форуме не предполагалось обучение... :shu:
Да разделов на самом форуме программирование приложений, ну ещё может быть один, два каких то...
На этом подзаработать не получиться... :%:
Это ж форум пользователей готовыми логически сформированными (не требующие, проектирования, разработки, заново, разве что, введение редких мелких промахов изменений, а может быть есть и такой коротенький список этих промахов) программными продуктами  КОМПАС, ЛОЦМАН, Renga, Pilot-ICE, ВЕРТИКАЛЬ, ну ещё Корпоративных Справочников и прикладных библиотек. ....
Остальное взаимопомощь в проектировании, формирование комплектов проектной документации....
Прошу прощения если что не так... >:(
Название: Re: Обучение программированию
Отправлено: ТрындецЪ от 27.02.17, 11:57:19
Пытаюсь получить длину отрезка контура (Length = iContourLineSegment.Length()),
но эта строка выбивает ошибку: 'float' object is not callable.
P.S.: Имя Length в коде до этого нигде не встречается.

UPD. Вопрос решился. Оказалось скобки в конце были лишними.
Правильная запись:Length = iContourLineSegment.Length

Кусок кода:
iDrawingContours = iDrawingContainer.DrawingContours
# перебираем все контуры
iIterator = Dispatch('KOMPAS.Application.5').GetIterator
iIterator.ksCreateIterator( 26, 0 )#CONTOUR_OBJ
obj = iIterator.ksMoveIterator( "F" )
if obj <> 0:
    iDrawingContour = iDrawingContours.DrawingContour(obj)# тут нужно указать номер контура в коллекции
    iContour = iDrawingContour._oleobj_.QueryInterface(KAPI7.NamesToIIDMap['IContour'], pythoncom.IID_IDispatch)
    iContour = KAPI7.IContour(iContour)
    N = iContour.Count #узнаём кол-во сегментов в контуре
    for i in (0,N-1):
        iContourSegment = iContour.Segment(i)
        iContourLineSegment = iContourSegment._oleobj_.QueryInterface(KAPI7.NamesToIIDMap['IContourLineSegment'], pythoncom.IID_IDispatch)
        iContourLineSegment = KAPI7.IContourLineSegment(iContourLineSegment)
        Length = iContourLineSegment.Length()
Название: Re: Обучение программированию
Отправлено: Slaviation от 28.02.17, 08:10:04
ЦитироватьКак в Python'е получить коллекцию точек чертежа и потом выделить часть из них, чьи координаты удовлетворяют какому-то условию.
Знаю, что через свойство Points интерфейса IDrawingContainer, но не могу добраться до него. В SDK путаюсь.
В прицепе пример на Python.
Запускать на активном чертеже в котором есть точки.
Название: Re: Обучение программированию
Отправлено: ТрындецЪ от 28.02.17, 10:43:28
Цитата: Slaviation от 28.02.17, 08:10:04
В прицепе пример на Python.
Запускать на активном чертеже в котором есть точки.
Я немного иначе делал. Во вложении мой код. Вроде бы и работает, но на чертеже точки не выделяются(читай " подсвечиваются зелёным").
Цель такая: выделяем окружность на чертеже и программа сама выделяет точки, которые попадают внутрь этой окружности. Чтобы эти точки мы потом смогли либо удалить, либо переместить мышью, либо скопировать и т.п.
Название: Re: Обучение программированию
Отправлено: Slaviation от 28.02.17, 11:58:46
Вариант с селектированием точек, лежащих внутри окружности.
Запускать на активном чертеже, в котором есть точки и одна выделенная окружность.
Точки, лежащие внутри окружности будут селектированы
Название: Re: Обучение программированию
Отправлено: ТрындецЪ от 28.02.17, 13:41:46
Цитата: Slaviation от 28.02.17, 11:58:46
Вариант с селектированием точек, лежащих внутри окружности.
Запускать на активном чертеже, в котором есть точки и одна выделенная окружность.
Точки, лежащие внутри окружности будут селектированы
Спасибо за помощь!
Доработал код, теперь проблем с выделением нет.
Название: Re: Обучение программированию
Отправлено: ТрындецЪ от 15.03.17, 15:19:08
Новая проблема. Как подписываться на события для окон документов (ksDocumentFrameNotify)?
Мне нужно поймать момент, когда нажата левая кнопка мыши.
Делал так

KAPI7.ksDocumentFrameNotify(3)

выходит ошибка

File "C:\Python26\lib\site-packages\Pythonwin\Kompas10API7.py", line 29462, in __init__
    cpc=oobj._oleobj_.QueryInterface(pythoncom.IID_IConnectionPointContainer)
AttributeError: 'int' object has no attribute '_oleobj_'

И ещё вопрос, как программно завершить выполнение команды, вызванной через ksExecuteKompasCommand?
Название: Re: Обучение программированию
Отправлено: Sabahs от 15.03.17, 15:57:01
Проверить, что процесс запущен, если да, тогда остановить StopCurrentProcess.
С событиями всё намного сложнее, я вообще не уверен, что Питон их поддерживает, т.к. нужно на них подписаться затем отписаться.
В качестве примера можете посмотреть SDK\Samples\Pascal\Delphi\step12\ApplicationEvents.pas, тут как раз идет реализация класса на обработку событий приложения, в числе которых - события мыши.
Название: Re: Обучение программированию
Отправлено: ТрындецЪ от 03.04.17, 13:08:11
Я создаю временную группу из выборочных объектов вида,и хочу очистить вид, чтобы вставить в него объекты из временной группы. Как удалить все объекты вида?
Название: Re: Обучение программированию
Отправлено: Sabahs от 03.04.17, 13:15:31
VGrupp:=NewGroup(0);
EndGroup;
SelectGroup(VGrupp,2,10E16,10E16,10E16,10E16);
DeleteObj(VGrupp);
Название: Re: Обучение программированию
Отправлено: ТрындецЪ от 03.04.17, 15:23:23
Цитата: Sabahs от 03.04.17, 13:15:31
VGrupp:=NewGroup(0);
EndGroup;
SelectGroup(VGrupp,2,10E16,10E16,10E16,10E16);
DeleteObj(VGrupp);
Благодарю! Ответ как всегда точно в цель, код работает.
Но для общего, так сказать, развития хотелось бы  прояснить для себя некоторые моменты.
"10E16,10E16,10E16,10E16" - координаты прямоугольника-ловушки. Судя по значениям координат, это точка в районе планеты Плутон. Из каких соображений выбраны именно эти координаты?
Название: Re: Обучение программированию
Отправлено: Sabahs от 03.04.17, 15:29:58
Фактически ловушка равна нулю и стоит далеко от начала координат, чтобы выделить всё, что в неё не попадёт, а попасть туда 100% ничего не может.
Название: Re: Обучение программированию
Отправлено: ТрындецЪ от 04.04.17, 10:26:15
Каким образом получить/выделить все геометрические объекты вида (отрезки, окружности, сплайны, кривые и т.п.)?
Находил в SDK экспортную функцию IsGeomObject (obj) -  проверить геометрический объект или нет.
Я не знаком с алгоритмом работы с экспортными функциями,и не уверен, подходит ли она вообще для решения этой задачи.
Пока я нашел такое решение:


# создаю  временную группу для сбора нужных объектов
TempGroup = iDocument2D.ksNewGroup( 1 )

# создаю список типов нужных  объектов
Geometry = [13025, 13072, 13075, 13079, 13083, 13085, 13087, 13093, 13095, 13097, 13099, 13101, 13115, 13151]

# получаю все объекты вида
Objects = iDrawingContainer.Objects( 0 )

# перебираю все объекты
for obj in Objects:

        # если типа объекта нет в списке
        if not obj.Type in Geometry :

            # удаляю его
            iDocument2D.ksDeleteObj (obj.Reference)
       
        # иначе
        else:

            # добавляю объект во временную группу
            add = iDocument2D.ksAddObjGroup( TempGroup, obj.Reference )

Но, как оказалось, не у всех объектов можно получить их тип (обозначение позиции, например).
В общем, мне этот путь совсем не нравится и предполагаю, что есть проще способ.
Можно же на чертеже выделять объекты по стилю линии. Я мог бы вызвать эту команду, но как программно реализовать выбор всех стилей линий во всплывающем окне, я не знаю.
Название: Re: Обучение программированию
Отправлено: Sabahs от 04.04.17, 10:37:00
Просто есть ещё контейнер условных обозначений - ISymbols2DContainer.
Название: Re: Обучение программированию
Отправлено: ТрындецЪ от 04.04.17, 11:00:56
Цитата: Sabahs от 04.04.17, 10:37:00
Просто есть ещё контейнер условных обозначений - ISymbols2DContainer.
Не знал. Интерфейс ISymbols2DContainer я получил. Как мне теперь разом опустошить весь этот контейнер?
Или придется получать интерфейсы коллекций всех возможных объектов, проверять количество элементов в коллекции и при наличии удалять поштучно?
Название: Re: Обучение программированию
Отправлено: Sabahs от 04.04.17, 11:10:28
Проще всё выделить и получить полный массив объектов от ISelectionManager.SelectedObjects, а затем его фильтровать.
Название: Re: Обучение программированию
Отправлено: ТрындецЪ от 04.04.17, 12:35:04
Цитата: Sabahs от 04.04.17, 11:10:28
Проще всё выделить и получить полный массив объектов от ISelectionManager.SelectedObjects, а затем его фильтровать.
Я поступил иначе. В имеющийся код добавил перехват исключений, что позволило пропускать объекты с неопределившимся типом.

for obj in Objects:
    try:
        # если типа объекта нет в списке
        if not obj.Type in Geometry :

            # удаляю его
            iDocument2D.ksDeleteObj (obj.Reference)
       
        # иначе
        else:
            # добавляю объект во временную группу
            add = iDocument2D.ksAddObjGroup( TempGroup, obj.Reference )
    except:

Не знаю насколько это верно, но работает.
Попробую переделать с Objects = iDrawingContainer.Objects ( 0 ) на 
Objects = iSelectionManager.SelectedObjects
чтобы не фильтровать лишние интерфейсы.
Название: Re: Обучение программированию
Отправлено: ТрындецЪ от 04.04.17, 15:53:08
Цитата: Sabahs от 04.04.17, 11:10:28
Проще всё выделить и получить полный массив объектов от ISelectionManager.SelectedObjects, а затем его фильтровать.
Поковырял я SelectionManager. В выделение так же попадают объекты с интерфейсом ILeader, IPositionLeader и их собратья, которые категорически не выдают своего Type и Reference, в следствие чего, удалить я их через iDocument2D.ksDeleteObj (obj.Reference)  не могу.
Название: Re: Обучение программированию
Отправлено: Sabahs от 04.04.17, 16:05:22
Куда они делись?
Просто объекты нужно привести к типу IDrawingObject, т.к. ISelectionManager.SelectedObjects возвращает массив выделенных объектов в виде SAFEARRAY | VT_DISPATCH.
Название: Re: Обучение программированию
Отправлено: ТрындецЪ от 04.04.17, 16:31:35
Цитата: Sabahs от 04.04.17, 16:05:22
Куда они делись?
Просто объекты нужно привести к типу IDrawingObject, т.к. ISelectionManager.SelectedObjects возвращает массив выделенных объектов в виде SAFEARRAY | VT_DISPATCH.
Спасибо! Получилось, сам толком не въехал как, но работает. Мозги уже плавятся после тяжёлого дня.
Название: Re: Обучение программированию
Отправлено: ТрындецЪ от 20.04.17, 09:25:56
В модели пытаюсь получить внешние информационные переменные, но не могу их программно отделить от не информационных.
Кусок кода:
VariableCollection = iPart.VariableCollection()
iPart.RebuildModel()
VariableCollection.refresh()

for i in range(VariableCollection.GetCount()):
    iVariable = VariableCollection.GetByIndex (i)
    Information = iVariable.Information

Значение Information для всех внешних переменных False, хотя среди них есть и информационные.
Что я делаю не так?
Название: Re: Обучение программированию
Отправлено: Sabahs от 20.04.17, 09:31:48
Для чего?
iPart.RebuildModel()
VariableCollection.refresh()
Название: Re: Обучение программированию
Отправлено: ТрындецЪ от 20.04.17, 09:45:59
Цитата: Sabahs от 20.04.17, 09:31:48
Для чего?
iPart.RebuildModel()
VariableCollection.refresh()
На случай, если модель требует перестроения.
Название: Re: Обучение программированию
Отправлено: Sabahs от 20.04.17, 11:36:43
Для начала проверить, что переменная возвращает, т.к. она не является булевой.   
Название: Re: Обучение программированию
Отправлено: ТрындецЪ от 20.04.17, 12:10:32
Цитата: Sabahs от 20.04.17, 11:36:43
Для начала проверить, что переменная возвращает, т.к. она не является булевой.   
Питон говорит, что она булева.
Название: Re: Обучение программированию
Отправлено: Sabahs от 20.04.17, 15:10:50
Прикрепите макрос, модель и таблицу переменных.
Название: Re: Обучение программированию
Отправлено: ТрындецЪ от 20.04.17, 15:21:22
Цитата: Sabahs от 20.04.17, 15:10:50
Прикрепите макрос, модель и таблицу переменных.
Вот макрос и тестовая модель. Переменные в модели.
Название: Re: Обучение программированию
Отправлено: Sabahs от 20.04.17, 16:31:37
Попробовал на Delphi через API5, результат тот же, завтра попробую иначе, хотя это уже ошибка.
Название: Re: Обучение программированию
Отправлено: Sabahs от 21.04.17, 08:49:09
Попробовал иначе, результат неизменен. Свойство программно устанавливается, только от таблицы живёт отдельно.
PS. В СТП написал, посмотрим, что ответят, запрос SD#795404.
Название: Re: Обучение программированию
Отправлено: ТрындецЪ от 21.04.17, 10:58:23
Цитата: Sabahs от 21.04.17, 08:49:09
Свойство программно устанавливается, только от таблицы живёт отдельно.
Я тоже пробовал. И устанавливается и снимается без проблем, но не отображается в окне переменных. Подозрительно ещё то, что можно снять информационность у любой переменной, хотя если переменная зависима от другой она не может быть неинформационной (при работе с переменными стандартным способом свойство информационности таких переменных неактивно).
Подождем ответа СТП.
Название: Re: Обучение программированию
Отправлено: Николай от 21.04.17, 12:07:33
Вот ещё вопрос. Открываем программно эскиз с уже начерченными там двумя макроэлементами 1 и 2.
Производим некий расчёт радиуса R и строим, например окружность 3

ksDocument2D.ksCircle 0, 0, R, 1 'Наружный диаметр

Далее необходимо передвинуть макроэлемент 1 по X на -12мм и Yпо на -50мм, а макроэлемент 2 по X на +21мм и поjY на -50мм,
чтобы получилась картинка, как внизу.

Вот и вопрос: как программно двигать готовые макроэлементы?
Название: Re: Обучение программированию
Отправлено: Sabahs от 21.04.17, 12:10:48
Ошибку по запросу SD#795404 исправили, исправление войдёт в Компас-3D v17.1.
Название: Re: Обучение программированию
Отправлено: Sabahs от 21.04.17, 12:12:57
Цитата: Николай от 21.04.17, 12:07:33
Вот ещё вопрос. Открываем программно эскиз с уже начерченными там двумя макроэлементами 1 и 2.
Производим некий расчёт радиуса R и строим, например окружность 3

ksDocument2D.ksCircle 0, 0, R, 1 'Наружный диаметр


Далее необходимо передвинуть макроэлемент 1 по X на -12мм и Yпо на -50мм, а макроэлемент 2 по X на +21мм и поjY на -50мм,
чтобы получилась картинка, как внизу.

Вот и вопрос: как программно двигать готовые макроэлементы?
Может новую тему создать, а эту закрыть, т.к. тут куча вопросов и попробуйте в ней найти ответ на нужный.
IMacroObject.SetPlacement
Название: Re: Обучение программированию
Отправлено: ТрындецЪ от 21.04.17, 12:35:29
Цитата: Sabahs от 21.04.17, 12:12:57
Может новую тему создать, а эту закрыть, т.к. тут куча вопросов и попробуйте в ней найти ответ на нужный.
Ответы на вопросы всё равно через строку поиска ищутся, а поиску всё равно отдельная это ветка или нет.
Темы с одним-двумя ответами больше захламляют. Лучше подразделы ввести, наверное.

Возвращаясь к предыдущей проблеме с переменными: в соседней теме http://forum.ascon.ru/index.php/topic,30188.0.html (http://forum.ascon.ru/index.php/topic,30188.0.html) с комментариями к переменным была аналогичная проблема.
Название: Re: Обучение программированию
Отправлено: Sabahs от 21.04.17, 14:01:06
Ответ СТП по прошлой проблеме был такой:"Нужно использовать функцию ksPart::GetFeature().VariableCollection.
Функция ksPart::VariableCollection предназначена только для изменения значений внешних переменных.
"

Но даже этот вариант не работал с ksVariable.Information, тут всё работает, можете убедится ответ на картинке, изменения отображаются в таблице после RebuildDocument.
Название: Re: Обучение программированию
Отправлено: pr0100 от 24.04.17, 18:01:06
Цитата: Николай от 21.04.17, 12:07:33
Вот ещё вопрос. Открываем программно эскиз с уже начерченными там двумя макроэлементами 1 и 2.
Производим некий расчёт радиуса R и строим, например окружность 3

ksDocument2D.ksCircle 0, 0, R, 1 'Наружный диаметр

Далее необходимо передвинуть макроэлемент 1 по X на -12мм и Yпо на -50мм, а макроэлемент 2 по X на +21мм и поjY на -50мм,
чтобы получилась картинка, как внизу.

Вот и вопрос: как программно двигать готовые макроэлементы?


Вашу задачу со штангенциркулем возможно реализовать и без применения программирования.
Файл приложен.
Название: Re: Обучение программированию
Отправлено: Николай от 25.04.17, 08:35:22
А можно сохранить в 5 версии? Имеем официально 9, но даже в 14 не открывается, А Вьювер воспроизводит неподвижную картинку... ::)
Название: Re: Обучение программированию
Отправлено: pr0100 от 25.04.17, 10:00:07
Цитата: Николай от 25.04.17, 08:35:22
А можно сохранить в 5 версии? Имеем официально 9, но даже в 14 не открывается, А Вьювер воспроизводит неподвижную картинку... ::)
Попробуйте, сохранил в 14.2. При сохранении в 5ю версию перестает работать.
Описание: в файле основного фрагмента создаемлокальный  фрагмент_1 и фрагмент_2, где начало координат каждого привязываем к размерным параметрам центра окружности. И с помощью переменных можем двигать фрагмент. Фрагмент в нашем случае аналогичен макро-элементу.
Название: Re: Обучение программированию
Отправлено: Николай от 25.04.17, 11:32:59
Хотя в версии 14.00 и не открылось, но, благодаря видео, принцип стал понятен, спасибо. А в качестве бонуса прикладываю чертёж этого штангенциркуля- может пригодиться. :)
Название: Re: Обучение программированию
Отправлено: ТрындецЪ от 28.04.17, 13:45:03
Как при сохранении фрагмента в формат *.dxf установить версию Автокада 2000.
iDocument2D.ksSaveToDXF (PathName) не даёт выбора версии.
Полагаю, что надо  через конвертер сохранять и настраивать ConverterParameters( long command), но где получить информацию от этих параметрах?
Название: Re: Обучение программированию
Отправлено: Sabahs от 28.04.17, 16:22:59
Только сохранением через конвертер, установить через визуальный диалог или разбираться с командами конвертера.
Название: Re: Обучение программированию
Отправлено: ТрындецЪ от 17.05.17, 12:53:14
Не могу докопаться до переменных через интерфейс iKompasDocument2D1.

iApplication = Dispatch('KOMPAS.Application.7')
iApplication = KAPI7.IApplication(iApplication)

iDocument = iApplication.ActiveDocument
iKompasDocument2D = KAPI7.IKompasDocument2D(iDocument)
iKompasDocument2D1 = KAPI7.IKompasDocument2D1(iKompasDocument2D)

print "1: ", iKompasDocument2D1
print "2: ", iKompasDocument2D1.Variables
print "3: ", iKompasDocument2D1.VariablesCount

Результат:
1:  <Kompas10API7.IKompasDocument2D1 instance at 0x111656632>
2:  <bound method IKompasDocument2D1.Variables of <Kompas10API7.IKompasDocument2D1 instance at 0x111656632>>
3:  <bound method IKompasDocument2D1.VariablesCount of <Kompas10API7.IKompasDocument2D1 instance at 0x111656632>>

Не знаю какие переменные видит  iKompasDocument2D1, но мне нужен доступ к пользовательским переменные 2D документа.

IView.Variables дал мне доступ к системным переменным, но пользовательские он не видит.
Название: Re: Обучение программированию
Отправлено: Sabahs от 17.05.17, 13:03:44
Вы его получили?
pKompasDocument2D1 :=  pKompasDocument2D as iKompasDocument2D1;
Название: Re: Обучение программированию
Отправлено: IgorT от 17.05.17, 13:14:59
Цитата: pr0100 от 25.04.17, 10:00:07
Попробуйте, сохранил в 14.2. При сохранении в 5ю версию перестает работать.
Описание: в файле основного фрагмента создаемлокальный  фрагмент_1 и фрагмент_2, где начало координат каждого привязываем к размерным параметрам центра окружности. И с помощью переменных можем двигать фрагмент. Фрагмент в нашем случае аналогичен макро-элементу.

Как Вам удалось наложить зависимости на геометрию фрагмента? Можно поподробнее рассказать?
Мне не удается повторить. :(

О! Похоже фрагменты позволят привязаться только  к началу координат фрагмента. Я правильно понял?
Название: Re: Обучение программированию
Отправлено: ТрындецЪ от 17.05.17, 13:18:33
Цитата: Sabahs от 17.05.17, 13:03:44
Вы его получили?
pKompasDocument2D1 :=  pKompasDocument2D as iKompasDocument2D1;
Судя по записи "1:  <Kompas10API7.IKompasDocument2D1 instance at 0x111656632>" наверное получил.
А вот из него ничего не получить. Может его к какому-то ещё интерфейсу привести надо?
Название: Re: Обучение программированию
Отправлено: Sabahs от 17.05.17, 13:23:45
И равен нулю.
Откройте SDK и посмотрите, что iKompasDocument2D1 получают от iKompasDocument2D.
Название: Re: Обучение программированию
Отправлено: ТрындецЪ от 17.05.17, 13:34:40
Цитата: Sabahs от 17.05.17, 13:23:45
Откройте SDK и посмотрите, что iKompasDocument2D1 получают от iKompasDocument2D.
Я так и получаю.
Для проверки работоспособности интерфейса решил проверить дочерний интерфейс ISelectionManager.
iApplication = KAPI7.IApplication(iApplication)

iDocument = iApplication.ActiveDocument

iKompasDocument2D = KAPI7.IKompasDocument2D(iDocument)
iKompasDocument2D1 = KAPI7.IKompasDocument2D1(iKompasDocument2D)

SelectionManager = iKompasDocument2D1.SelectionManager
SelectionManager.UnselectAll()

iKompasDocument2D1.RebuildDocument()


Код работает, выделение с объектов снимается.
Название: Re: Обучение программированию
Отправлено: ТрындецЪ от 17.05.17, 13:51:20
Напал на след!
Оказывается методу VariablesCount() нужен аргумент 0/1 (False/True), чтобы он показал кол-во либо всех пользовательских переменных, либо кол-во только внешних переменных. В справке нет про это ни слова.
VariablesCount = iKompasDocument2D1.VariablesCount(0)

Для Variables() также нужен аргумент.
1 (True) - формирует список ссылок на интерфейсы всех внешних переменных, если переменная одна, то вместо ссылки на интерфейс выдается значение этой переменной.
0 (False) - формирует список ссылок на интерфейсы всех переменных у которых не пустая ячейка в столбце "Выражение", если переменная одна, то вместо ссылки на интерфейс выдается значение этой переменной, если у неё не пустая ячейка в столбце "Выражение".
Название: Re: Обучение программированию
Отправлено: pr0100 от 17.05.17, 15:15:45
Цитата: IgorT от 17.05.17, 13:14:59
О! Похоже фрагменты позволят привязаться только  к началу координат фрагмента. Я правильно понял?
Да верно, от сюда и плясать со всей параметризацией.
Название: Re: Обучение программированию
Отправлено: IgorT от 17.05.17, 15:30:48
 :(
А в К-17 случайно не добавили возможность цепляться за любую геометрию макроэлементов/фрагментов в целях параметризации?
Название: Re: Обучение программированию
Отправлено: ТрындецЪ от 02.06.17, 12:55:31
Как на Python получить интерфейс IKompasDocument3D1?
Название: Re: Обучение программированию
Отправлено: lua от 03.07.17, 14:29:20
Коллеги, прошу сильно не пинать, если написал не туда. Не могу понять, как программно нарисовать отрезок в 3D с координатами относительно текущей ЛСК. Хоть и выставлена ЛСК текущей, но в результате отрезок создается относительно Начала координат      

Segment_3D->BuildingType = ksLineSegment3DTypeEnum::ksLSTTwoPoints;
Segment_3D->SetPoint (TRUE, X1, Y1, Z1);
Segment_3D->SetPoint (FALSE, X2, Y2, Z2);
Название: Re: Обучение программированию
Отправлено: Sabahs от 03.07.17, 14:34:49
Необходимо установить свойство IKompasDocument3D.CreateObjectsInCurrentLocalCS.
Doc3D.CreateObjectsInCurrentLocalCS:=True;
Название: Re: Обучение программированию
Отправлено: ТрындецЪ от 04.07.17, 16:17:11
Пробовал поэкспериментировать с ЛСК. ЛСК создаётся, назначается текущей.
Но, при создании отрезка, координаты его концов, которые я забиваю соответствуют координатам глобальной СК.
Хотя, в переменных для отрезка прописываются локальные координаты.
Отсюда вопрос: что дописать в код, чтобы при создании отрезка можно было вводить координаты соответствующие ЛСК?

# -*- coding: cp1251 -*-

import Kompas10API5 as KAPI
import Kompas10API7 as KAPI7
from win32com.client import Dispatch
import LDefin3D
import ksConstants3D as CONST3D7

iKompasObject = Dispatch('KOMPAS.Application.5')
iKompasObject = KAPI.KompasObject(iKompasObject)

iApplication = Dispatch('KOMPAS.Application.7')
iApplication = KAPI7.IApplication(iApplication)

##iSystemSettings = iApplication.SystemSettings
##iSystemSettings.ModelLocalCSSetActive = True
##iSystemSettings.ModelLocalCSCreateInAbsoluteCS = True

iDocument3D = iKompasObject.ActiveDocument3D()
iDocument = iApplication.ActiveDocument
iKompasDocument3D = KAPI7.IKompasDocument3D(iDocument)
iPart7 = iKompasDocument3D.TopPart
iPart = iDocument3D.GetPart(LDefin3D.pTop_Part)

# Создаём ЛСК
iAuxiliaryGeomContainer = KAPI7.IAuxiliaryGeomContainer(iAuxiliaryGeomContainer)
iLocalCoordinateSystems = iAuxiliaryGeomContainer.LocalCoordinateSystems
iLocalCoordinateSystem = iLocalCoordinateSystems.Add()
iLocalCoordinateSystem.OrientationType = CONST3D7.constants.ksAxisOrientation
iLocalCSParameters = iLocalCoordinateSystem.LocalCSParameters
iLocalCSAxesDirectionParam = KAPI7.ILocalCSAxesDirectionParam(iLocalCSAxesDirectionParam)
matrix = [0.146447, 0.853553, 0.5, 0, -0.853553, -0.146447, 0.5, 0, 0.5, -0.5, 0.707107, 0, 10, 10, 10, 1]
iLocalCoordinateSystem.InitByMatrix3D(matrix)
iLocalCoordinateSystem.Update()

# Создавать новые объекты в ЛСК
iKompasDocument3D.CreateObjectsInCurrentLocalCS=True

# Создаём отрезок по двум точкам
iLineSegments3D = iAuxiliaryGeomContainer.LineSegments3D
iLineSegment3D = iLineSegments3D.Add()
iLineSegment3D.BuildingType = CONST3D7.constants.ksLSTTwoPoints
# Координаты начала в глобальной СК
iLineSegment3D.SetPoint(True, 0, 0, 0)
# Координаты конца в глобальной СК
iLineSegment3D.SetPoint(False, 50, 0, 0)
iLineSegment3D.Update()
Название: Re: Обучение программированию
Отправлено: lua от 04.07.17, 17:14:36
Цитата: ТрындецЪ от 04.07.17, 16:17:11
Пробовал поэкспериментировать с ЛСК. ЛСК создаётся, назначается текущей.
Но, при создании отрезка, координаты его концов, которые я забиваю соответствуют координатам глобальной СК.
Да, точно. Подтверждаю. Координаты при создании пересчитываются относительно глобальной СК.
Цитата: ТрындецЪ от 04.07.17, 16:17:11
Хотя, в переменных для отрезка прописываются локальные координаты.
А в переменных у меня тоже пересчитанные относительно глобальной...
Название: Re: Обучение программированию
Отправлено: Sabahs от 05.07.17, 14:32:23
Надо пересчитывать.
Название: Re: Обучение программированию
Отправлено: pr0100 от 11.05.18, 07:31:34
Цитата: Slaviation от 03.12.15, 13:16:11
Если процесс размещения компонента предполагалось дать пользователю, то:
Правильнее было бы дать пользователю соответствующую компасовую панель, со всеми возможностями размещения.
Сделать это можно запустив процесс KompasObject::ksExecuteKompasCommand(prAddPartFromFile, True).
После запуска этому процессу понадобится файл для вставки и процесс создаст событие BeginRequestFiles (на него надо будет предварительно подписаться).
В обработчике этого события подсовываем свой файл.
Имеем интерактивный процесс размещения компонента со всеми "наворотами".


Как на питоне подписаться на событие "BeginRequestFiles" и запустить процесс "ksExecuteKompasCommand"?
Название: Re: Обучение программированию
Отправлено: ALEXEY ZATEEV от 22.02.19, 19:48:07
Помогите пожалуйста: как получить в Питоне значения размерных переменных? Я инженер, что касается черчения - справляюсь, но вынужден пробовать писать скрипт на Питоне (Компас-Макро), а в программировании дуб дубом, даже азы :`(
И вообще не пойму (SDK уже до дыр прочел) как можно получить идентификаторы всех объектов чертежа?
Например, в виде множества, словаря и т. п. ... Пока с трудом представляю себе объектную модель документа Компас.
Цель -- считать значения свойств отрезка (длины, координат концов и т. д.), который уже есть на плоском чертеже (.frw), и присвоить их значения переменным Питона для дальнейшего использования. Может пример готовый есть? 8-)
Название: Re: Обучение программированию
Отправлено: НЕЙРОН от 29.04.20, 15:42:01
# (Python)(2020 год) Перебор (Итератор) всех отрезков и получение их координат , через API5
#  Получим активный документ
kompas_document = application.ActiveDocument
kompas_document_2d = kompas_api7_module.IKompasDocument2D(kompas_document)
iDocument2D = kompas_object.ActiveDocument2D()

# Итератор, перебор существующих отрезков:
iIterator = kompas_object.GetIterator()
iIterator.ksCreateIterator( 1, 0 ) #  - Cоздать итератор для перемещения по объектам документа.(0-все объекты 1-отрезки и т.д. смотреть SDK) tipSearch - тип объекта(очень много),parent - указатель на объект (для движения по группе, внутри макроэлемента, по слою).

obj = iIterator.ksMoveIterator( "F" ) # - Переместить итератор (позиционироваться на объекте) F - первый объект,N - следующий объект
CHislo_otrezkov=0

if iDocument2D.ksExistObj(obj):              # Если объекты существуют, то тогда делать цикл
    while iDocument2D.ksExistObj(obj) != 0:  # ksExistObj - Проверить существование объекта. Возвращаемое значение:(1 - в случае наличия объекта)(0 - в случае отсутствия объекта)

        CHislo_otrezkov = CHislo_otrezkov+1

        LineN  = kompas6_api5_module.ksLineSegParam(kompas_object.GetParamStruct(kompas6_constants.ko_LineSegParam))
        LineN.Init()
        LineN.x1  # Координата Х1 отрезка
        LineN.y1  # Координата Y1 отрезка
        LineN.x2  # Координата X2 отрезка
        LineN.y2  # Координата Y2 отрезка
        print ("Координаты отрезка №",LineN," Х1,Y1,X2,Y2 = ",LineN.x1,',',LineN.y1,',',LineN.x2,',',LineN.y2)

        obj = iIterator.ksMoveIterator( "N" ) # - Переместить итератор (позиционироваться на объекте) F - первый объект,N - следующий объект

iIterator.ksDeleteIterator()  # ksDeleteIterator - Удалить блок параметров навигации по модели
print('Количество отрезков в чертеже= ',CHislo_otrezkov)
Название: Re: Обучение программированию
Отправлено: Умка от 08.09.20, 11:05:07
# -*- 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()

iDrawingDocument = kompas_document._oleobj_.QueryInterface(kompas_api7_module.IDrawingDocument.CLSID, pythoncom.IID_IDispatch)
iDrawingDocument = kompas_api7_module.IDrawingDocument(iDrawingDocument)


iTechnicalDemand=iDrawingDocument.TechnicalDemand
iTechnicalDemand.AutoPlacement = False
iTechnicalDemand.BlocksGabarits = (25.0, 65.0, 200.0, 263.0)
iTechnicalDemand.Update()

Скрипт размещения техтребований над основной надписью (питон 2). Нужно прописать зависимость от формата чертежа