Обозначение ценра отверсий

Автор injener, 04.04.16, 23:01:07

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

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

Вират Лакх

Это какой-то другой макрос получается. А зачем в эскизе расставлять осевые?

ТрындецЪ

25.10.17, 11:54:46 #41 Последнее редактирование: 25.10.17, 12:25:03 от ТрындецЪ
Макрос для вывода координат центра и радиуса выделенных окружностей уже кто-то выкладывал:
# -*- coding: utf-8 -*-
import pythoncom
from win32com.client import Dispatch, gencache

module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
api = module.IKompasAPIObject(Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(module.IKompasAPIObject.CLSID, pythoncom.IID_IDispatch))
const = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants

app = api.Application
doc = app.ActiveDocument #  если я в активном 2D документе
doc2D = module.IKompasDocument2D(doc._oleobj_.QueryInterface(module.IKompasDocument2D.CLSID, pythoncom.IID_IDispatch))
doc2D1 = module.IKompasDocument2D1(doc2D._oleobj_.QueryInterface(module.IKompasDocument2D1.CLSID, pythoncom.IID_IDispatch))

selection_manager = doc2D1.SelectionManager
selected_objects  = selection_manager.SelectedObjects
#T = selection_manager(unselect())

if isinstance(selected_objects, tuple): #  выделяю несколько
    for object in selected_objects:
        if object.DrawingObjectType is not  const.ksDrCircle: # окружностей
            continue
        circle = module.ICircle(object)
        print "x: ", circle.Xc # хочу узнать координаты центра
        print "y: ", circle.Yc
        print "R= ", circle.Radius,u' мм'
else:
        if selected_objects.DrawingObjectType ==  const.ksDrCircle: # окружностей
            circle = module.ICircle(selected_objects)
            print "x: ", circle.Xc # хочу узнать координаты центра
            print "y: ", circle.Yc
            print "R= ", circle.Radius,u' мм'

А вот как посчитать кол-во одинаковых элементов в списке:
K=[]
# заполняем список К объектами

Dct = {} # создаём словарь
for i in K:
    Dct[i] = Dct.get(i,0)+1
Dct2 = Dct.items() # из словаря получаем список
Dct2.sort() # сортируем

В итоге получим список содержащий подсписки, состоящие из элемента и кол-ва его повторений.

Upd: Попробовал добавить обработку дуг окружностей. И задумался, а оно вообще надо? Всем скруглениям будет ОЦ расставлять. Или будем фильтровать дуги по каким то параметрам? Во вложении макрос для теста, работающий с дугами пока только из выделения.
+ Благодарностей: 2

ТрындецЪ

25.10.17, 14:51:50 #42 Последнее редактирование: 25.10.17, 15:39:47 от ТрындецЪ
Обозначения центров v0.5

Что нового:
- добавлена работа с дугами, эллипсами и дугами эллипсов.
- добавлены константы, которые включают и исключают обработку окружностей, дуг окружностей, эллипсов, дуг эллипсов и константа, отвечающая за параметризацию ОЦ.
+ Благодарностей: 1

Вират Лакх

26.10.17, 06:02:24 #43 Последнее редактирование: 26.10.17, 06:20:35 от Вират Лакх
ЦитироватьПопробовал добавить обработку дуг окружностей. И задумался, а оно вообще надо? Всем скруглениям будет ОЦ расставлять. Или будем фильтровать дуги по каким то параметрам?

Дуги окружностей все-таки надо. Например для видов на картинках ниже. А фильтровать будем путем ручного указания областей обработки вместо запуска на весь документ. Пользователь выберет способ запуска в зависимости от содержимого чертежа.

См. на первую картинку. При запуске на весь документ останавливается на выделенном виде и в отладчике пишет:
ЦитироватьTraceback (most recent call last):
  File "D:\!Компас\Макро\ОЦ.pyw", line 277, in <module>
    if For_View(iView):
  File "D:\!Компас\Макро\ОЦ.pyw", line 80, in For_View
    Sbor_info ( BD, Circle )
  File "D:\!Компас\Макро\ОЦ.pyw", line 152, in Sbor_info
    s += 1
NameError: global name 's' is not defined

Для выделенной геометрии или выделенных видов работает.

Что-то надо сделать с быстродействием обработки. Алгоритм пересмотреть? Даже алгоритм лучший из лучших не решит проблему скорости.
Например, см. вторую картинку. Этот вид макрос обрабатывает больше 20 секунд. Здесь поиск концентричности не нужен.
Сделать в константах настройку искать ли концентричность? Неудобно лазить за ней каждый раз.
Делать графический интерфейс? Тоже не хотелось бы.
Или ОЦ делить на два макроса: один тупо ставит на всё, другой - умный?
Или типа разделить: запускать с параметром/ключом. Файл макроса один и тот же.  Если запустить как обычно, то тупо всем ставит. Если запустить "ОЦ.pyw k", то с анализом концентричности. Утилиты компаса позволяют указывать параметры.
Или можно запустить макрос с клавишей-модификатором? В зависимости от нажатости, например, Shift, действовать тупо и быстро, или умно и медленно.
Если пойдет разделение в пределах одного файла макроса, то можно с фланцевым объединить, разделив параметром или клавишей-модификатором.
+ Благодарностей: 1

ТрындецЪ

Обозначения центров v0.5.1

Что нового:
- добавлена константа для учёта концентричности (как показала практика, быстродействия не прибавило);
- добавлен счётчик созданных ОЦ в финальное сообщение;
- исправлены ошибки (в предыдущих версиях есть грубая ошибка, проявляющаяся на чертежах, где максимальный номер вида не соответствует  кол-ву всех видов -1).
+ Благодарностей: 1

Вират Лакх

Поставил concentricity = False. Да, толку мало. Что-то неладное тут творится. Библиотека injener'а на массив отверстий 10х10 ставит обозначения центров мгновенно. Макрос же мурыжит ну очень долго.
Или из-за того, что это макрос, а не библиотека. Или используется какая-то тормозная функция, и можно сделать быстрее без неё... В отладчике можно увидеть какая функция выполняется в данный момент времени? Подсветку выполняемой строки и все такое?

Ясное дело, что библиотека будет работать быстрее, чем макрос.

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

ТрындецЪ

Цитата: Вират Лакх от 26.10.17, 16:38:08В отладчике можно увидеть какая функция выполняется в данный момент времени? Подсветку выполняемой строки и все такое?

Python не славится быстродействием. Может и можно подсвечивать код при выполнении, я не интересовался. При отладке print'ы в код вставляю, если нужно какое-то место проработать.

Вират Лакх

Посмотрел вчера на узкие места макроса в плане быстродействия дебаггером + принтами.
Вся эта процедура def For_View(iView) тормозная: и чтение геометрии, и вставка обозначений...
Получается один жирный минус у макроса :(, и от библиотеки injener'а отказаться не получается.

ТрындецЪ

Обозначений центров для "фланца" v0.2

Что нового:
- добавлена обработка дуг окружностей;
- появились настройки.
+ Благодарностей: 4

Вират Лакх

27.10.17, 16:09:23 #51 Последнее редактирование: 27.10.17, 19:34:38 от Вират Лакх
1) По ОЦ фланцев предложение сделать аналогично простой ОЦ: когда мы выделяем окружности НЕактивного вида, учитывать это, переключаться и расставлять правильно. Обычная ОЦ правильно поступает.
2) Теперь "претензия" обычному ОЦ: чего он бегает по всем видам, когда надо расставить только в выделенной геометрии?
3) Кто как считает, может не возвращать активность тому виду, который был до запуска обоих макросов, а оставлять на том виде, который обставляли центрами?
4) Я так понял, у вас есть разделение Создано обозначения -ний -ние. Для 12 шт. и около неё пишет неправильно.
5) От себя рекомендую настройку по умолчанию delta = 0.1 мм, а то и 1 мм попробовать. На чертеже два обозначения на таком расстоянии друг от друга все равно не смотрятся. Дублирования (наложения) обозначений теперь нет :)
- = UPD = -
У фланцев для определения центра предлагаю брать не первые три окружности/дуги из выделенного (конечно, если будет выделено всего три, то придется их троих и брать), а три окружности/дуги, которых (какого радиуса) больше по количеству. Т.е. получить двумерный массив количеств и радиусов отв./дуг, выбрать по наибольшему кол-ву соответствующие отв./дуги. Короче говоря, почти конечная цель: выделить весь фланец, т.к. это легче. А раз выделили весь фланец, то наибольшему по диаметру, если он больше определяющих центр и находится в этом центре, поставим прямое обычное ОЦ. А теперь конечная цель: обработать обозначениями полностью фланец за одно выделение и один запуск макроса.
+ Благодарностей: 1

pr0100

Не много переделал макрос, теперь можно считать выделенные окружности. Где макрос отсортирует и укажет количество каждого типа. Живой пример на скрине.
+ Благодарностей: 2

Kilia

Было бы круто если бы макрос еще и заливку делал одинаковых отверстий (как на чертеже выше), если есть отверстия разных диаметров.
И возможно ли сделать из макроса библиотеку как сделано у топикстартера?

KiDim

А можно еще спросить? А точки проставить данным макросом возможно? Задача из жизни - есть эскиз с кучей отверстий без центров и точек. По нему делается массив точек, а потом массив по точкам. Если бы макрос проставлял точки, то экономия будет по времени очень ощутима...

pr0100

30.10.17, 19:01:36 #55 Последнее редактирование: 30.10.17, 19:16:13 от pr0100
Цитата: KiDim от 30.10.17, 17:15:12
А можно еще спросить? А точки проставить данным макросом возможно? Задача из жизни - есть эскиз с кучей отверстий без центров и точек. По нему делается массив точек, а потом массив по точкам. Если бы макрос проставлял точки, то экономия будет по времени очень ощутима...


Вот попробуете, макрос расставляет точки как в 2d так и в эскизах 3d. Для того, чтобы расставить в 3d эскизе, нужно спроектировать на плоскость поверхность с отверстиями потом основной стиль линий изменить на какой то другой, чтобы скрыть из отображения в 3d.
+ Благодарностей: 1

ТрындецЪ

Цитата: Kilia от 30.10.17, 16:34:26
Было бы круто если бы макрос еще и заливку делал одинаковых отверстий (как на чертеже выше), если есть отверстия разных диаметров.

Можно заморочиться, если совсем нечем будет заняться.
ЦитироватьИ возможно ли сделать из макроса библиотеку как сделано у топикстартера?

Нельзя, насколько мне известно. Но можно добавить макрос, как утилиту, и тогда можно вынести его на панель инструментов или на контекстную панель.

pr0100

30.10.17, 23:10:01 #57 Последнее редактирование: 30.10.17, 23:20:34 от pr0100

Цитата: ТрындецЪ от 30.10.17, 22:38:12
Но можно добавить макрос, как утилиту, и тогда можно вынести его на панель инструментов или на контекстную панель.
в 17й пока нельзя, мой запрос в СТП по поводу проигнорировали

ТрындецЪ

30.10.17, 23:50:18 #58 Последнее редактирование: 31.10.17, 00:05:45 от ТрындецЪ
Цитата: pr0100 от 30.10.17, 23:10:01
в 17й пока нельзя, мой запрос в СТП по поводу проигнорировали

Печаль-беда  :`(
Нашёл наконец-таки возможность параметризовать геометрию в 2D программно.
Прикрутил в последнем макросе привязку точек  к центрам окружностей.

Upd: В версии 0.3 упростил код, удалив чтение параметров окружностей. Всё что нужно от окружности - это её Reference.
+ Благодарностей: 2

KiDim

Цитата: pr0100 от 30.10.17, 19:01:36
Вот попробуете, макрос расставляет точки как в 2d так и в эскизах 3d. Для того, чтобы расставить в 3d эскизе, нужно спроектировать на плоскость поверхность с отверстиями потом основной стиль линий изменить на какой то другой, чтобы скрыть из отображения в 3d.

Скачал. Сделал эскиз в модели - несколько окружностей с разными стилями линий. Вызвал Компас-Макро. Выбрал выложенный макрос. Нажал запустить. Эффекта нет. Выделили окружности. Еще раз запустил. Такая же ситуевина. Может чего то не так делаю? Компас х64 15.2.20.