Обучение программированию

Автор Alal, 26.03.16, 09:13:20

« предыдущая - следующая »

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

Slaviation

ЦитироватьПодскажите, если я в активном 2D документе выделяю несколько отрезков и хочу узнать координаты их начальных и конечных точек, как мне это сделать? В SDK смотрел, но не могу найти нужные мне методы, как я их вижу.
Если не сложно, желательно показать на примере в питоне или на край в паскале, синтаксис С, бейсика и тд совсем не понимаю

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


Пример в прицепе.
В примере нет проверок на наличие/отсутствие чего-либо, поэтому откройте в КОМПАС чертеж, выделите несколько объектов, среди которых есть отрезки.
В проводнике встаньте на файл test.pyw, вызовите контекстное меню, выберите пункт "Edit with IDLE" или "Edit with Pythonwin", после того как код примера откроется в редакторе нажмите F5.
Координаты отрезков будут выведены в интерактивное окно редактора.

Алхимик

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?

Slaviation

ЦитироватьДля чего вы добавили "tuple"

if isinstance(selected_objects, tuple): - это проверка того, что selected_objects является кортежем, т.е. что было селектировано более одного объекта.
Если был выделен один объект, то selected_objects это он и есть.

ЦитироватьПо какому принципу определяется последовательность отрезков с которых считываем данные? Random?

Не знаю, ответ наверное нужно искать в реализации ISelectionManager.

Алхимик

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

В общем - матчасть наше все 88))

Slaviation

ЦитироватьХотел установить для отрезков длинной больше 50мм стиль - тонкая. Ошибка не выводится, но и ничего и не изменяется.

В прицепе пример, в котором меняется стиль линии на "тонкая" у селектированных отрезков длинной более 50 мм.

Алхимик

Т.е. до "Update" у нас просто идет чтение нужной информации Пайтоном с Компаса? Очень интересно :shu:

Алхимик

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

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

Для примера чтобы использовать свойства печати, необходимо так делать? Код не обязателен, нужна удочка, а не рыбка 88))

Алхимик

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

ТрындецЪ

Как в Python'е получить коллекцию точек чертежа и потом выделить часть из них, чьи координаты удовлетворяют какому-то условию.
Знаю, что через свойство Points интерфейса IDrawingContainer, но не могу добраться до него. В SDK путаюсь.

Vitalij Lysanov

Код из примеров библиотеки 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





ТрындецЪ

Спасибо за ответ! А что это за библиотека Pik10? Может там ещё чего полезного для новичков имеется?

Vitalij Lysanov


tramp_m

На сколько мне известно, вроде как бы на форуме не предполагалось обучение... :shu:
Да разделов на самом форуме программирование приложений, ну ещё может быть один, два каких то...
На этом подзаработать не получиться... :%:
Это ж форум пользователей готовыми логически сформированными (не требующие, проектирования, разработки, заново, разве что, введение редких мелких промахов изменений, а может быть есть и такой коротенький список этих промахов) программными продуктами  КОМПАС, ЛОЦМАН, Renga, Pilot-ICE, ВЕРТИКАЛЬ, ну ещё Корпоративных Справочников и прикладных библиотек. ....
Остальное взаимопомощь в проектировании, формирование комплектов проектной документации....
Прошу прощения если что не так... >:(

ТрындецЪ

27.02.17, 11:57:19 #33 Последнее редактирование: 27.02.17, 13:45:39 от ТрындецЪ
Пытаюсь получить длину отрезка контура (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()

Slaviation

ЦитироватьКак в Python'е получить коллекцию точек чертежа и потом выделить часть из них, чьи координаты удовлетворяют какому-то условию.
Знаю, что через свойство Points интерфейса IDrawingContainer, но не могу добраться до него. В SDK путаюсь.

В прицепе пример на Python.
Запускать на активном чертеже в котором есть точки.

ТрындецЪ

Цитата: Slaviation от 28.02.17, 08:10:04
В прицепе пример на Python.
Запускать на активном чертеже в котором есть точки.

Я немного иначе делал. Во вложении мой код. Вроде бы и работает, но на чертеже точки не выделяются(читай " подсвечиваются зелёным").
Цель такая: выделяем окружность на чертеже и программа сама выделяет точки, которые попадают внутрь этой окружности. Чтобы эти точки мы потом смогли либо удалить, либо переместить мышью, либо скопировать и т.п.

Slaviation

Вариант с селектированием точек, лежащих внутри окружности.
Запускать на активном чертеже, в котором есть точки и одна выделенная окружность.
Точки, лежащие внутри окружности будут селектированы

ТрындецЪ

Цитата: Slaviation от 28.02.17, 11:58:46
Вариант с селектированием точек, лежащих внутри окружности.
Запускать на активном чертеже, в котором есть точки и одна выделенная окружность.
Точки, лежащие внутри окружности будут селектированы

Спасибо за помощь!
Доработал код, теперь проблем с выделением нет.

ТрындецЪ

Новая проблема. Как подписываться на события для окон документов (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?

Sabahs

Проверить, что процесс запущен, если да, тогда остановить StopCurrentProcess.
С событиями всё намного сложнее, я вообще не уверен, что Питон их поддерживает, т.к. нужно на них подписаться затем отписаться.
В качестве примера можете посмотреть SDK\Samples\Pascal\Delphi\step12\ApplicationEvents.pas, тут как раз идет реализация класса на обработку событий приложения, в числе которых - события мыши.