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

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

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

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

ТрындецЪ

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

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

Вират Лакх

Цитироватьif str(n)[-2:-1] in ["11","12","13","14",]:
        text = "\nобозначений центра"       
у меня не стала работать. Убрал -1 из [-2:-1] заработало. Лучше код так написать:
Цитировать
if str(n)[-1] in ["0","5","6","7","8","9"] or str(n)[-2:] in ["11","12","13","14"]:
        text = "\nобозначений центра"
+ Благодарностей: 1

Вират Лакх

ТрындецЪ, Не везде срабатывает учет количества объектов одинакового радиуса. Например, разрушенный макроэлемент Фланец 1-10-1 Ст 20 ГОСТ 12820-80 из библиотеки СИ. См. картинку.

pro100, если макрос Считать количество выделенных окружностей запустить без выделенной геометрии, то:
Traceback (most recent call last):
  File "D:\!Компас\Макро\Считать количество выделенных окружностей.cdm", line 34, in <module>
    if selected_objects.DrawingObjectType ==  const.ksDrCircle: # окружносС,ей
AttributeError: 'NoneType' object has no attribute 'DrawingObjectType'
Это остатки от ТрындецЪкого макроса или было что-то задумано?
+ Благодарностей: 1

ТрындецЪ

Цитата: Вират Лакх от 01.11.17, 06:37:46
ТрындецЪ, Не везде срабатывает учет количества объектов одинакового радиуса. Например, разрушенный макроэлемент Фланец 1-10-1 Ст 20 ГОСТ 12820-80 из библиотеки СИ. См. картинку.
В этом фланце макрос принимает центры отверстий лежащими на одной прямой, т.к. они не проходят проверку if abs(abs((x1 - x2)/(x3 - x2)) - abs((y1 - y2)/(y3 - y2))) >= delta

Нужно придумать что-то более универсальное. У меня уже мозг вскипает  :%:.
Логика была такая:
Есть уравнение прямой: (x1 - x2)/(x3 - x2)) = (y1 - y2)/(y3 - y2)
В него мы передаём координаты центров трех окружностей и если равенство выполняется, то эти три окружности лежат на одной прямой и через их центры мы не сможем провести центральную окружность.
Но!  Т.к. КОМПАС выдаёт координаты центров с какой-то степенью точности, а Python очень дотошен до мелочей  (как, впрочем, и Вират Лакх ;)), то с 99% вероятностью равенство не выполнится. Поэтому приходится находить разность левой и правой части уравнения и сравнивать эту погрешность с какой-то допустимой, заранее оговоренной, величиной ( в моём случае это delta, но это очень грубовато).
Есть ещё одно "но": если знаменатель дроби равен 0 (как в случае с последним фланцем), то выбивает ошибку "деления на 0"
Да и числитель второй дроби тоже =0, хотя центры не на одной прямой.
Нужно продумать этот момент.

Вират Лакх

Давайте по порядку. Расскажите сначала программу.
"Выделите не менее трёх неконцентрических окружностей, центры которых не лежат на одной прямой!" надо добавить "или дуг окружностей".
BD.append([ R, x, y, obj ]) - формируете матрицу, где obj - это указание на дугу или окружность?
Dct, Dct2, BD2 - это кто?
x1 y1 x2 y2 x3 y3 - Координаты каких трех точек?
Циклом while (m + 2) <= len (BD2)-1 пробуете найти три точки для нахождения центра фланца?
abs(abs((x1 - x2)/(x3 - x2)) - abs((y1 - y2)/(y3 - y2))) >= delta - почему вы тут разность отношений координат, которая без единиц измерения, сравниваете с дельтой, у которой есть ед. изм.?
Давайте сделаем проще анализ положения третьей точки на прямой, образованной первыми двумя точками:
y3p = (y2-y1)/(x2-x1)*(x3-x1) - это ордината точки на прямой для x3.
Если |y3-y3p| <= delta, то считаем, что (x3;y3) лежит на прямой и окружность фиг построить.
А перед этим надо провести проверку трех скобок: |y2-y1|>delta, |x2-x1|>delta, и |x3-x1|>delta - должно быть True, иначе считаем, что выбраны окружности, расположенные слишком близко, чтобы расставлять ОЦ. Когда три скобки проверим, то не будет нуля ни в числителе, ни в знаменателе.
Пока debug на этом остановим.

ТрындецЪ

01.11.17, 13:25:47 #85 Последнее редактирование: 01.11.17, 13:52:05 от ТрындецЪ
Цитата: Вират Лакх от 01.11.17, 12:32:36
Давайте по порядку. Расскажите сначала программу.
Выделяем на чертеже область и запускаем макрос.
Макрос получает выделенные объекты в виде списка и отбирает из всех объектов только дуги и окружности. (BD.append([ R, x, y, obj ])). Для каждого отобранного объекта в списке BD будет сформирован подсписок состоящий из [R-радиуса, х  и y - координаты центра, obj - ссылка на объект] (по сути, координаты пока не нужны, они потом понадобятся для поиска концентричности).
Теперь нам надо выяснить какого радиуса больше всего в списке.
Для этого мы создаём словарь Dct, где ключами будут значения радиусов. Перебираем список BD и формируем словарь Dct (в тонкости вдаваться не буду). В итоге получаем что-то типа этого: Dct = { R1: [4,[obj1, obj2, obj3, obj4]], R2: [2, [obj5, obj6]], , R3: [3, [obj7, obj8,  obj9]]}, т.е { Радиус: [ кол-во объектов такого радиуса, [ ссылки на объекты ]....}
Т.к. словари не упорядочены, то словарь Dct преобразуем в список Dct2 ( Dct2 = Dct.items() ), а затем сортируем этот список по количествам радиусов от большего к меньшему ( Dct2.sort( key = lambda x: x[1][0], reverse=True) ).
Теперь в начале списка Dct2 будут элементы с чаще встречающимися радиусами.
Dct2 имеет сложную структуру, содержащую подсписки, которая нам уже не нужна. Поэтому, мы создаём новый список BD2, и из списка Dct2 переносим только ссылки на объекты. Порядок элементов при этом не нарушается, и первыми в списке BD2 будут объекты, радиусов которых больше всего.
Далее, мы берём нулевой, первый и второй элементы списка BD2 и получаем координаты их центров. Что происходит потом, я уже описывал.
Если взятые элементы не подошли, то смещаемся по списку BD2 на одну позицию вперёд и берём первый, второй и третий элементы и т.д., пока список не закончится.

Цитировать
Давайте сделаем проще анализ положения третьей точки на прямой, образованной первыми двумя точками:
y3p = (y2-y1)/(x2-x1)*(x3-x1) - это ордината точки на прямой для x3.
Если |y3-y3p| <= delta, то считаем, что (x3;y3) лежит на прямой и окружность фиг построить.
А перед этим надо провести проверку трех скобок: |y2-y1|>delta, |x2-x1|>delta, и |x3-x1|>delta - должно быть True, иначе считаем, что выбраны окружности, расположенные слишком близко, чтобы расставлять ОЦ. Когда три скобки проверим, то не будет нуля ни в числителе, ни в знаменателе.
Не понял про проверку скобок. Они все одновременно должны быть True, по-вашему?
Вот координаты первых элементов, которые не пропускает макрос:
17.6776695297 17.6776695297
-17.6776695297 17.6776695297
-17.6776695297 -17.6776695297

Вират Лакх

Это я в первом приближении написал и не додумал полностью.
Забыл дописать y1 в выражении: y3p = (y2-y1)/(x2-x1)*(x3-x1) + y1
Да, действительно, проверять все три скобки не надо. Это, видимо, из-за забытой y1 я затупил. Одну надо скобку проверить, чтобы не получить 0 в знаменателе.
Проверка на концентричность не выполнена же на этом этапе программы? Почему бы сначала не отАнтиКонцентричить массив BD2 ? Или лучше BD обработать (перенести BD = Sort_BD(BD) перед Dct = {} # создаём словарь), а уже из отфильтрованного BD получить BD2 без концентрических окружностей/дуг, чтобы лишний раз не проверять на слишком близкое расположение.
Потом остается проверить на нахождение на одной прямой (вертикальной или любой другой):
Если x2==x1, то: (при этом игреки из-за сортировки заведомо далеко друг от друга, т.е. >delta)
  если |x3-x1|<=delta, то три точки находятся на вертикальной прямой и continue цикл,
  иначе break циклу.
Иначе если |(y2-y1)/(x2-x1)*(x3-x1) + y1 - y3| <= delta, то continue цикл,
  иначе break циклу.
Может даже лучше |x3-x1|<=delta заменить на x3==x1 (как x2==x1), т.к. оба сравниваемые числа имеют одинаковую компасную точность, и равенство произойдет.

VIO

13.04.18, 18:42:16 #87 Последнее редактирование: 13.04.18, 18:52:28 от VIO
Не подскажите как её подключить?
И что за расширение руw?
:shu:
И будет ли работать с 64-разрядной версией компаса?
Она только для фланцев, или может работать как старая добрая библиотека "Обозначение центра"?
Лично мне она очень помогала.  :)

ТрындецЪ

Цитата: VIO от 13.04.18, 18:42:16
Не подскажите как её подключить?
И что за расширение руw?
:shu:
И будет ли работать с 64-разрядной версией компаса?
Она только для фланцев, или может работать как старая добрая библиотека "Обозначение центра"?
Лично мне она очень помогала.  :)
Есть две отдельные версии макроса: для окружностей и для фланцев.
Чтобы эти макросы работали нужно, чтобы в системе был установлен Python версии 2.х и его библиотека pywin32 (Компас во время установки библиотеки КОМПАС-МАКРО всё это ставит автоматом). Если этого нет, то можно скачать из интернета и установить (благо всё бесплатно).
Сам же макрос запускается на выполнение двойным кликом мыши.
+ Благодарностей: 1

Вират Лакх

Чо та мы совсем забросили эти два макроса. Летом после 17-го июня надо будет попробовать за них взяться...

ТрындецЪ

Цитата: Вират Лакх от 14.04.18, 10:32:36
Чо та мы совсем забросили эти два макроса. Летом после 17-го июня надо будет попробовать за них взяться...
Что за дата такая значимая?

Вират Лакх

Я своих домашних провожу в далекую деревню на две-три недели )

msvteh

в макрос Обозначения центров v0.5.1 для себя добавил установку центров для выделенных прямоугольников
надо ещё многоугольники добавить

msvteh

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

Что нового:
- добавлена простановка обозначений центров выделенных прямоугольников и многоугольников.
- добавлены константы, которые включают и исключают обработку прямоугольников и многоугольников.

работает в v14.2 если выделить прямоугольники или многоугольники
+ Благодарностей: 1

Умка

Работает на Кv13.2 WXP даже без запуска консоли, но не обозначает центры многоугольников и прямоугольников ассоциативных чертежей при включенных константах.

msvteh

в ассоциативных чертежах и в эскизе трехмерного элемента прямоугольников как единого объекта нет - это набор отдельных отрезков со своими ограничениями и связями , поэтому интерфейсы объектов прямоугольников и многоугольников, которые я использовал,  работать не будут

genek87

01.06.18, 11:48:12 #96 Последнее редактирование: 01.06.18, 12:26:10 от genek87
Было бы шикарно ещё добавить в библиотеку Обозначения центров v0.5.2 возможность простановки центров только на окружности, дуги и тд с определенным стилем линии (основная, тонкая, вспомогательная). Если для стиля линии свойство в библиотеке False, то не проставлять центра, True - проставлять.

ТрындецЪ

Цитата: genek87 от 01.06.18, 11:48:12
Было бы шикарно ещё добавить в библиотеку Обозначения центров v0.5.2 возможность простановки центров только на окружности, дуги и тд с определенным стилем линии (основная, тонкая, вспомогательная).
+ Благодарностей: 3

genek87

Ох, то что надо. Да ещё так оперативно, благодарю.

Михаил88

Макрос позволяет расставить центра отверстиям на чертеже по всем имеющимся видам. Запускать на активном чертеже.
Т.к. в К18.1 нет еще такой функции написал для себя. Теперь делюсь. Возможно кому то будет полезно.

exe - https://disk.yandex.ru/d/kE324q5yrz1ZkA
pyw - https://disk.yandex.ru/d/d080f12uSdrQjg

Screenshot_2.png