Как аппроксимировать дугу в автокаде
Перейти к содержимому

Как аппроксимировать дугу в автокаде

  • автор:

Как аппроксимировать дугу в автокаде

Плагин AVC_OutsideLoop для AutoCAD и BricsCAD

Формирование замкнутых полилиний из любых кривых. Аппроксимация сплайнов с заданным допуском. Чистка и оптимизация контуров.

Данная команда пригодится, что бы оптимизировать сплайны, преобразовывать их в полилинии. Перед вытягиванием контуров в твердое тело тоже очень полезно вызвать эту программу. Она объединяет в себе _Join, _Boundary, _Overkill, _Splinedit и много дополнений.

Если на вашем производстве используются фрезерные станки ЧПУ, то вам наверняка приходится готовить контуры деталей перед экспортом в CAM программу. Не достаточно сделать плоские снимки с 3D солидов. Нужно убрать наложения и пересечения линий, преобразовать сплайны к дугам, замкнуть контуры в полилинии, назначить правильные слои в соответствии с типом обработки. Всю эту работу можно сделать штатными средствами Автокада. Но это долго и можно не заметить многих ошибок.

Возможности программы

    • Ищет самый большой наружный контур в наборе пересекающихся линий и кривых.
    • Допускает, чтоб линии пересекались. Все хвосты будут отрезаны.
    • Замыкает контуры внутри наружного, вложенные друг в друга и распределяет их по слоям – для наружной и внутренней фрезеровки.
    • Можно сформировать сразу несколько контуров за один вызов команды.
    • Соединяет небольшие разрывы в контуре.
    • Подправит слегка покосившиеся горизонтали и вертикали.
    • Преобразует сплайны и эллипсы в линии и дуги с заданным допуском (максимальным отклонением от исходной кривой).
    • Проецирует 3d сплайны и 2d и 3d полилинии на плоскость XY для преобразования в обычные полилинии.
    • Работает с объектом 2d-полилиния, который возникает при взрыве текстов командой TXTEXP.
    • Восстанавливает окружности из эллипсов и сплайнов, когда был криво спроецирован цилиндр (отверстие в солиде).
    • Чистит мусор: мелкие отрезки, точки, наслоения линий друг на друга или расположенные слишком близко (аналогично команде чистки Overkill).
    • Склеивает крошечные обрезки линий в полноценные линии и дуги.
    • Умеет заменять цепочки мелких линий дугами, и наоборот, слишком прямые дуги – прямыми линиями.
    • Объединяет линию, разбитую на сегменты в одну целую. Тем самым оптимизирует количество сегментов.
    • Переворачивает дуги, у которых NormalZ=-1. Это те самые дуги, которые оставляет FlatShot и из-за которых невозможно ни вытянуть твердое тело, ни обработать на ЧПУ.
    • Раскидывает полученные контуры по слоям. Если обнаружены внутренние контуры, то программа может записать глубину фрезерования в имя слоя.
    • Выявит контуры выборок, которые нельзя за раз пройти заданной фрезой и поместит в отдельный слой.
    • Вызывает команду Внутренний угол для формирования заходов фрезы в угол. Опционально для внешних и внутренних контуров.
    • Фильтрует выбранные линии, игнорируя невидимые и вспомогательные по слоям и типу линий.
    • Работает в ПСК (UCS). Все объекты будут спроецированы на плоскость XY текущей ПСК.
    • Работает в пределах заданных, настраиваемых погрешностей.
    • Можно включать и отключать управление слоями.
    • Можно использовать слои из файла-шаблона.

    Данная команда вызывается внутри команд ЧПУ Подготовка (NCP) и Габариты (DimOverall).

    О загрузке и установке плагина читайте тут .

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

      • Годовая лицензия — 15 EUR .
      • Вечная лицензия — 75 EUR . Бесплатные обновления 1 год.
      • Пробный период — 20 дней.

      Порядок использования команды

      Выберите все кривые и вызовите команду OSL. Если объекты не выбраны заранее, то команда запросит их выбрать. В запросе будет опция НАстроить — она открывает диалог настройки.

      На команду Внешний контур влияют Общие настройки программ A>V>C>. При включенной опции «Назначать слои» команда будет присваивать контурам слой NC_Внешний или NC_Внутренний. Однако если слои NC_ уже были назначены исходным линиям, то команда не будет их трогать. А при отключенной опции всем внутренним контурам будет назначен голубой цвет (индекс 150).

      Основные настройки данной команды находятся в разделе «Контуры для ЧПУ-обработки». Обратите внимание на опции из разделов Выбор объектов, Оптимизация контуров, Фрезеровка и Фрезеровка углов, а так же на поле ввода Глубина.

      Затянувшийся процесс оптимизации можно прервать кнопкой Esc.

      Следите за командной строкой – туда выводятся все сообщения программы.

      Настройки команд ЧПУ

      Вы можете вызвать диалог настроек, выбрав опцию НАстроить. Или используйте Палитру настроек A>V>C> на закладке ЧПУ.

      У всех опций есть всплывающая подсказка.

      Настроек много и для вашего удобства можно использовать готовые наборы настроек, которые я называю Стиль ЧПУ. Вы можете создать до 9и стилей. Переключить текущий стиль можно в заголовке окна настроек. А можно прямо во время работы команды вызвать опцию ПереключитьСтиль и выбрать стиль по его номеру.

      Внимание! Текущий стиль ЧПУ действует на все команды работы с контурами. Переключив стиль в одной команде вы будете работать с этим стилем и во всех остальных командах тоже.

      Как апроксимировать дугу отрезками? (геометрия)

      Пол дня убил, чтоб вывести формулу центра дуги из координат начала/конца и bulge.

      Получилось вот такое:

      X_centr = (y1-y2-b^2*y1+b^2*y2+2*b*x1+2*b*x2)/4*b
      y_centr = (x2-x1+b^2*x1-b^2*x2+2*b*y1+2*b*y2)/4*b

      (сам офигел, думал будет проще. но работает)

      x1,y1 координаты начальной точки
      x2,y2- конечной
      b бульджа ,знак учитывается

      Дальше думаю преобразовать все в полярные координаты и вычислять точки.

      Может есть проще алгоритмы для апроксимации?

      Единственное что напрягает — изобретаю велосипед, ибо есть в PLTOOLS.
      Но если в лиспе и могу чтото понять, (хотя он какойто наоборот от обычных языков ) то с vla, на котором сделан PLTOOLS, все хуже, его исходников я не нашел

      ЗЫ. на вопрос: чем не устраивают сами PLTOOLS:
      задача сделать программу, где автокад только средство отображения результата.

      Последний раз редактировалось iskatel111, 22.03.2014 в 22:23 .
      Просмотров: 4295

      iskatel111
      Посмотреть профиль
      Найти ещё сообщения от iskatel111

      LISP, C# (ACAD 200[9,12,13,14])

      Регистрация: 25.08.2003
      С.-Петербург
      Сообщений: 39,745

      Исходники vla = практически исходники VBA
      P.S. Если касаться AutoCAD, то в руки vlax-curve-* функции, там все есть.

      __________________
      Моя библиотека lisp-функций

      Обращение ко мне — на «ты».
      Все, что сказано — личное мнение.

      Кулик Алексей aka kpblc
      Посмотреть профиль
      Посетить домашнюю страницу Кулик Алексей aka kpblc
      Найти ещё сообщения от Кулик Алексей aka kpblc

      Регистрация: 11.05.2005
      Сообщений: 6,989

      Здесь в двух частях вся геометрия а картинках и формулах без vla
      http://www.afralisp.net/archive/lisp/Bulges1.htm

      __________________
      Как использовать код на Лиспе читаем здесь
      Регистрация: 03.04.2008
      Сообщений: 5,537

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

      Регистрация: 13.06.2012
      Сообщений: 98
      Сообщение от Кулик Алексей aka kpblc
      Исходники vla

      так я ж и пишу, что не нашел их. Было бы проще

      Сообщение от gomer

      Вообще тут все довольно просто: имеем центр дуги, ее радиус, начальный и конечные углы, разбиваем дугу на n участков, получаем приращение угла на n точек, находим точки и рисуем полилинию

      Да, это конечно очень просто. См первый пост — там только формулы центра дуги, совсем просто. Радиус фиг с ним, легко вычисляется. А вот углы. Тут зачемто придумали квадранты, и разное поведение в них тангенса.

      ЗЫ. а в школе учили, что все так легко: проводим перпендикуляр, ищем пересечение.
      ЗЫЫ. на вышке — глобальная тригонометрия. горы синус_косинусов
      ЗЫЫЫ. а в координатах то и не учили

      iskatel111
      Посмотреть профиль
      Найти ещё сообщения от iskatel111

      Регистрация: 03.04.2008
      Сообщений: 5,537
      Сообщение от iskatel111
      См первый пост — там только формулы центра дуги, совсем просто.
      Я так понимаю AutoCAD DXF Reference даже не открывалось?
      Регистрация: 13.06.2012
      Сообщений: 98
      Извиняюсь, неточно выразился — имеется ввиду дуговой сегмент полилинии

      iskatel111
      Посмотреть профиль
      Найти ещё сообщения от iskatel111

      Регистрация: 03.04.2008
      Сообщений: 5,537
      Сообщение от iskatel111
      Извиняюсь, неточно выразился — имеется ввиду дуговой сегмент полилинии
      Тогда еще проще, находите точки по параметру, делаете bulge = 0, добавляете вершины

      Конструирование в области нефтеразведки

      Регистрация: 10.02.2006
      Сообщений: 321
      Посмотри здесь http://elpanov.com/index.php?id=34

      __________________
      Никогда не спорьте с дураками — они опустят Вас до своего уровня и победят за счет опыта

      Регистрация: 25.02.2014
      Сообщений: 2

      Если без Vla-, может тогда просто черчением? построить отрезки от центра до начала и конца искомой дуги, найти угол между ними, далее полярный массив одного из отрезков. По конечным точкам получившихся отрезков строишь дуги (или полилинии) и удаляешь все, что тебе не надо.

      Регистрация: 29.09.2011
      Сообщений: 285

      Радиус дугового сегмента = (/ (длина хорды — дистанция между текущим dxf10, в котором dxf42 не 0 и следующим) 2.0 (sin (* 2 (atan (значение dxf42)))))

      Регистрация: 13.06.2012
      Сообщений: 98
      Сообщение от ciril

      Радиус дугового сегмента = (/ (длина хорды — дистанция между текущим dxf10, в котором dxf42 не 0 и следующим) 2.0 (sin (* 2 (atan (значение dxf42)))))

      А Вы, батенька, шутник.

      dxf10 — координата Х, дистанция между иксами вещь оч полезная в данном случае

      А вообще, мож кому пригодится:

      радиус = (sqrt( (x2-x1)^2 + (y2-y1)^2)) * (b^2+1)) /4b

      это если вспомнить что sin (2* atan (b)) = 2b/(b^2 + 1)

      iskatel111
      Посмотреть профиль
      Найти ещё сообщения от iskatel111

      Регистрация: 29.09.2011
      Сообщений: 285

      10й dxf код — это вообще-то координата вершины А продемонстрируйте программу, которая будет вычислять радиусы по вашей формуле и выводить их, ну например, в командную строку, по моей формуле — вот:

       
      (defun c:extrad (/ x00 x01 x02) (while (not (and (setq x00 (car (entsel "\nВыберите полилинию. "))) (eq "LWPOLYLINE" (cdr (assoc 0 (setq x01 (entget x00))))))) (princ "\nПолилиния не выбрана. ")) (setq x00 0) (repeat (cdr (assoc 90 x01)) (if (zerop (cdr (setq x02 (assoc 42 x01)))) (setq x01 (cdr (member x02 x01))) (princ (strcat "\nR" (itoa (setq x00 (1+ x00))) " = " (rtos (/ (distance (cdr (assoc 10 x01)) (cdr (assoc 10 (setq x01 (cdr (member x02 x01)))))) (sin (* 2.0 (atan (abs (cdr x02))))) 2.0) 2 3))))) (princ))

      собственно вычисление радиуса:

       
      (/ (distance (cdr (assoc 10 x01)) (cdr (assoc 10 (setq x01 (cdr (member x02 x01)))))) (sin (* 2.0 (atan (abs (cdr x02))))) 2.0)

      ----- добавлено через ~3 ч. -----
      Вот код, который аппроксимирует без vla-

       
      (defun c:аппра (/ x00 x01 x02 x03 x04 x05 x06 x07 x08) (while (not (and (setq x00 (car (entsel "\nВыберите полилинию. "))) (eq "LWPOLYLINE" (cdr (assoc 0 (setq x01 (entget x00))))))) (princ "\nПолилиния не выбрана. ")) (initget 7) (setq x00 (reverse (member (assoc 39 x01) (reverse x01))) x02 (list) x03 (getint "\nВведите коэффициент сглаживания: ")) (repeat (1- (cdr (assoc 90 x01))) (if (zerop (cdr (setq x04 (assoc 42 x01)))) (setq x02 (append x02 (list (assoc 10 x01))) x01 (cdr (member x04 x01))) (progn (setq x02 (append x02 (list (setq x05 (assoc 10 x01)))) x07 (- (angle (setq x05 (cdr x05)) (setq x06 (cdr (assoc 10 (setq x01 (cdr (member x04 x01))))))) (* 2 (setq x04 (atan (cdr x04))))) ;угол касательной к ОХ x06 (/ (distance x05 x06) (sin (* 2.0 (abs x04))) 2.0) ;радиус дуги x04 (/ x04 x03) ;приращение угла x08 0) (repeat (1- (* 2 x03)) (setq x02 (append x02 (list (cons 10 (polar x05 (+ x07 (setq x08 (+ x08 x04))) ;угол хорды (* x06 (sqrt (- 2 (* 2 (cos (* 2 (abs x08))))))) ;следствие теоремы косинусов для равнобедренных треугольников ))))))))) (entmod (append (subst (cons 90 (1+ (length x02))) (assoc 90 x00) x00) x02 x01)) (princ))

      Последний раз редактировалось ciril, 26.03.2014 в 13:44 .

      Как аппроксимировать дугу в автокаде

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

      Редактирование полилиний заключается в их замыкании и размыкании, а также в перемещении, добавлении и удалении отдельных вершин. Имеется возможность выпрямления полилинии между двумя вершинами, настройки типа линии так, что до и после каждой вершины рисуются штрихи. Можно задать единую ширину для всей полилинии или управлять шириной для каждого сегмента. Полилинии можно также линейно аппроксимировать в сплайновые кривые.

      Сегменты объединяемых полилиний

      К разомкнутой полилинии можно присоединить отрезок, дугу или другую полилинию, если их конечные точки совпадают. Если конечные точки не совпадают, но расстояние между ними не превышает некоторого критического значения, то объединение выполняется с помощью обрезки, удлинения или создания нового сегмента.

      Свойства объединенных полилиний

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

      Дополнительные опции редактирования полилиний

      Для редактирования полилиний, кроме общих операций редактирования, применяемых ко многим объектам, предусмотрены также дополнительные опции редактирования и объединения, реализуемые командой ПОЛРЕД.

      • "Замкнуть". Создание замыкающего сегмента полилинии, соединяющего его последний сегмент с первым. Полилиния считается открытой, пока ее не замкнуть с помощью параметра "Замкнуть".
      • "Соединить". Добавление линий, дуг или полилиний к концу открытой полилинии и отмена сглаживания для полилиний, сглаженных дугой. Конец добавляемого объекта должен точно совпадать с одной из конечных точек полилинии.
      • "Ширина". Задание новой единой ширины для всей полилинии. Можно воспользоваться также подопцией "Ширина" опции "Вершина" для изменения начальной и конечной ширины отдельных сегментов.

        • Обрезка и удлинение объектов
        • Разрыв и соединение объектов

        Аппроксимация дуг

        Трассировка с буферной зоной и новый функционал пространственных операций создают геометрические объекты с дугами.

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

        В настоящий момент это можно сделать, применив последовательно экспорт в MIF/MID и импорт из него.

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

        Нюанс (не для реализации, пока только для обсуждения):

        При аппроксимации вроде бы все и всегда заменяют дугу фрагментом ВПИСАННОГО многоугольника. При этом площадь полигона уменьшается (дуги обычно выпуклые).

        Ещё можно применить ОПИСАННЫЙ многоугольник, площади будут увеличиваться.

        Средний вариант (самый сложный) - средний между ВПИСАННЫМ и ОПИСАННЫМ. При аппроксимации может быть реализован меньшим числом рёбер (для заданной погрешности) и изменение площади значительно меньше.

        Обратная задача (замена рёбер дугой) надеюсь не имеет прикладного значения.

        И ещё: как данный функционал может быть представлен в API, если там нет рёбер, есть вершины?

        0 0 Отмена
        Подписаться

        Ответ

        Добавлен модуль операций над контурами, в котором содержится указанная функция аппроксимации дуг.

        Зачем вам нужны аппроксимированные дуги именно в ИнГео?

        При экспорте в форматы, не поддерживающие дуги (например MIF/MID) аппроксимация выполняется автоматически.

        Практически все работы я делаю в ИнГЕО и только в ИнГЕО без перепрыгивания в MapInfo, ArcGIS, AutoCAD, ArchiCAD, Microstation и т.д..

        Одна из работ - правила землепользования и застройки с картой зон с особыми условиями использования территории, которая содержит санитарно-защитные зоны промыщленных объектов и инженерно-транспортных магистралей.

        Для этого удобно использовать ТРАССИРОВКУ с буферной зоной отличной от нуля.

        В результате мы получаем объекты с закруглениями с месте перегиба.

        Конечный результат необходимо аппроксимировать прямыми с округлением до см.

        Площади и другие характеристики должны быть посчитаны уже с учётом конечного результата и упакованы в XML-формат.

        Вот мне и не хватает всего-то аппроксимации.

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

        Перечитал мотивировку. Отвечу ещё раз, теперь только другими словами.

        Аппроксимированные дуги - как то не так сформулировано, может быть и понято не так?

        Дуги у меня в ИнГЕО формируются (ТРАССИРОВКА).

        Мне нужны отрезки вместо дуг, но при этом не простое спрямление крайних точек, а учитывающее введённое значение погрешности аппроксимации.

        Я так понял, что вы выгружаете данные в XML при помощи какого-то модуля.

        Тогда там и надо вставлять аппроксимацию. Алгоритм аппроксимации не такой уж и сложный (наверняка у вас есть).

        Зачем понижать точность в исходном материале (ИнГео)?

        В модуле нет апроксимации. Он предполагает что исходная информация из ИнГЕО - полигоны, с границей состоящей только из прямых отрезков.

        Это только один пример.

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

        Реализация уже есть в модули экспрота в формат MIF/MID.

        Было бы чудесно обернуть её в интерфейс API.

        Округление (понижение точности) - это было так, попутно. К данной теме отношения не имеет и уже имеет несколько решений.

        Но всё-же маленькое пояснение:

        Росреестр округляет координаты земельных участков. Надо признать что это очень важный информационный слой при работе с территорией. Формируя земельные участки приходится округлять координаты формируемых ЗУ и исходя из этого вычислять площадь.

        Росреестр прописывает площадь ЗУ с дельтой (плюс, минус) и влияние округления на площадь не привысит эту погрешность, но Росррестр считает что эта дельта придумана не для нас: - "Что вам мешает указать достоверную площадь? Какое такое округление, что за детский лепет, сначала округляйте а уж потом вычисляйте площадь.".

        Возможен ли ещё какой-то выход из данной ситуации, чтобы в ИнГЕО не понижать точность исходных данных и вычислять площадь на основании округлённых координат?

        Конечто возможен, но для этого надо писать модуль или встраивать в ИнГЕО. Допустим в окне свойств объекта отражается площадь и периметр по точным координатам. Там много места чтобы отобразить ещё и аналогичные параметры с учётом округления. Разрядность округления можно вынести в общие настройки.

        "Реализация уже есть в модули экспрота в формат MIF/MID."
        Она не совсем корректна. Это проявляется в следующем, если есть два соседних объекта с общей дугой, то при экспорте одна и таже дуга в разных объектах пароксимируется по разному и в итоге узлы на результирующих объектах не совпадают. Видимо зависит от направления объекта.

        Добавлен модуль операции с контурами, в котором содержится указанная функция аппроксимации дуг.

        Добавлен модуль операций над контурами, в котором содержится указанная функция аппроксимации дуг.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *