| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Создание внешнего контура на основе выделенного набора примитивов

Создание внешнего контура на основе выделенного набора примитивов

Ответ
Поиск в этой теме
Непрочитано 09.12.2010, 09:02 #1
Создание внешнего контура на основе выделенного набора примитивов
Shaft
 
отдел открытых горных работ
 
Новокузнецк
Регистрация: 06.05.2009
Сообщений: 124

Всем доброго времени суток, Уважаемые форумчане!!!

Стоит такая вот задача:
Создать контур (внешний) на основе набора выделенных примитивов!

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

Миниатюры
Нажмите на изображение для увеличения
Название: 2010-12-09_120135.jpg
Просмотров: 386
Размер:	32.3 Кб
ID:	49690  

Вложения
Тип файла: dwg
DWG 2004
example.dwg (282.2 Кб, 2383 просмотров)

Просмотров: 13637
 
Непрочитано 09.12.2010, 09:17
#2
Лиспер


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


Попробуй _.boundary.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 09.12.2010, 10:15
#3
Shaft

отдел открытых горных работ
 
Регистрация: 06.05.2009
Новокузнецк
Сообщений: 124


Цитата:
Сообщение от Лиспер Посмотреть сообщение
Попробуй _.boundary.
Это в моём случае негодиться совсем! Т.к. самые крайние границы придется сводить в замкнутый контур. В таком случае проще обвести вручную (как я и делаю), а так как таких контуров мне приходиться делать много и регулярно, то я хотел бы уйти от данной ручной работы Отнимающей приличную кучу времени!
Shaft вне форума  
 
Непрочитано 09.12.2010, 10:49
1 | #4
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


LISP. Отрисовка внешнего контура выбранных объектов
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 09.12.2010, 11:09
#5
Shaft

отдел открытых горных работ
 
Регистрация: 06.05.2009
Новокузнецк
Сообщений: 124


VVA, Огромное Вам спасибо!
Но увы ваша программа выдает непредсказуемый результат. Я пробовал создать контур в файле примера (который выложил в 1 посте). Получается весьма причудливо.

Ps Код был взять из шапки той темы, ссылку на которую вы мне дали.
Shaft вне форума  
 
Непрочитано 09.12.2010, 11:17
#6
Лиспер


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


В той теме много кодов. И на следующей странице - тоже.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 09.12.2010, 11:19
#7
Shaft

отдел открытых горных работ
 
Регистрация: 06.05.2009
Новокузнецк
Сообщений: 124


Цитата:
Сообщение от Лиспер Посмотреть сообщение
В той теме много кодов. И на следующей странице - тоже.
Я пробовал код с обеих страниц, в итоге взял тот что в шапке на 1-ой странице.
Shaft вне форума  
 
Непрочитано 09.12.2010, 11:25
#8
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Я так понял, что программа ECO корректно обрабатывает только замкнутые объекты. Для набора незамкнутых полилиний результат будет не тот, который ожидает Shaft.
Do$ вне форума  
 
Непрочитано 09.12.2010, 12:52
#9
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Внутри ECO использует тот же самый _boundary. Поэтому если _boubdary не подходит, то и ECO не подойдет. Чтобы получить общий контур объекты должны пересекаться.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 09.12.2010, 12:56
#10
Лиспер


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


Offtop: У меня никак не получается придумать гарантированно работающий алгоритм
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 09.12.2010, 13:17
#11
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Ну вкратце так (если все объекты - полилинии):
Находим крайнюю полилинии и обходим вдоль нее в каком-нибудь направлении. Полилиния заканчивается - переходим на следующую по какому-нибудь правилу... и до тех пор, пока контур не замкнется.
Shaft, есть какие-нибудь правила, по которым вручную контур строится?
Do$ вне форума  
 
Автор темы   Непрочитано 09.12.2010, 13:39
#12
Shaft

отдел открытых горных работ
 
Регистрация: 06.05.2009
Новокузнецк
Сообщений: 124


Do$, когда строиться вручную, то просто строиться полилиния по крайним полилиниям. Чтобы даже вершины совпадали. Т.е. если посмотреть в файле-примере, то там видно что вершины контура совпадают с вершинами карйних полилиний. Переход от крайней полилинии к внутренней производиться перпендикулярно к последней. Это желательно, но не объязательно.

Зы Если я не совсем понятно объяснил (вы скажите) Тогда я попробую изобразить это в файле-примере.

Последний раз редактировалось Shaft, 09.12.2010 в 14:16.
Shaft вне форума  
 
Непрочитано 09.12.2010, 14:38
#13
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
У меня никак не получается придумать гарантированно работающий алгоритм
У меня родился такой алгоритм:
1. Для всех линейных объектов (не обязательно полилиний) находим общий габаритный контейнер (boundingbox). LISP. LIB. Получение габаритов для списка объектов.
В результате имеем некий прямоугольник, описывающий все выбранные примитивы.
Это первое грубое приближение контура
2. Обходим прямоугольник с неким шагом. Для текущей точки ищем ближайшую точку из всех выбранных примитивов и берем ее.
Если не понятно, то попробую нарисовать. Мне кажется, что алгоритм рабочий.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 10.12.2010, 06:24
#14
Shaft

отдел открытых горных работ
 
Регистрация: 06.05.2009
Новокузнецк
Сообщений: 124


Цитата:
Сообщение от VVA Посмотреть сообщение
У меня родился такой алгоритм:
Я так понял, что это не готовая программа, а только элемент для ее написания... верно ? Потому как мне неудалось получить от нее ождиаемого результата
Shaft вне форума  
 
Непрочитано 10.12.2010, 10:08
#15
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Это библиотечная ф-ция для выполнения п.1 алгоритма.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 10.12.2010, 11:19
#16
Shaft

отдел открытых горных работ
 
Регистрация: 06.05.2009
Новокузнецк
Сообщений: 124


VVA, я так и подозревал, что фигню пытался сделать!
Что поделать, делитант я полный (пока) в lispe
Shaft вне форума  
 
Непрочитано 10.12.2010, 14:13
2 | #17
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Первый вариант на основе алгоритма, изложенного в #13
Код:
[Выделить все]
(defun C:TEST( )
(vl-load-com)
  (
   (lambda ( / ss lst bb bb-pline step param pt)
     (setq ss (ssget  '((0 . "*LINE,ARC,CIRCLE"))))
     (setq bb (lst-getboundingbox (setq lst (lib:conv-pickset-to-vlalist ss))))
     (setq bb (mapcar '(lambda(x)(mapcar '+ x '(0 0))) bb))
     (command "_.Rectang" "_w" 0  "_none" (car bb) "_none" (cadr bb))
     (setq bb-pline (vlax-ename->vla-object(entlast)))
     (setq step 0.01 ;_Шаг обхода габаритного контейнера
           param 0
           )
     (while (< param (vlax-curve-getEndParam bb-pline))
       (setq pt (vlax-curve-getPointAtParam bb-pline param))
       (setq near_pt_list (cons(car
       (vl-sort
         (mapcar '(lambda(x)(vlax-curve-getClosestPointTo x pt)) lst)
         '(lambda(a b)(< (distance pt a)(distance pt b)))
         )
       ) near_pt_list)
       )
       (setq param (+ param step))
     )
     (command "_.Pline" "_none" (car near_pt_list))
     (foreach a (cdr near_pt_list)(command "_none" a))
     (command "_c")
     (SSSETFIRST nil (ssget "_L"))
     (vla-Erase bb-pline)
     )
    )
  (princ)
  )



;|============================================================================= 
*    Функция преобразования набора, полученного через (ssget), в список 
* ename-примитивов. 
*    Параметры вызова: 
*   value   набор примитивов 
*    Примеры вызова: 
(lib:conv-pickset-to-list (ssget))
=============================================================================|; 
(defun lib:conv-pickset-to-list (value / item lst)
       (repeat (setq item (sslength value)) ;_ end setq
         (setq lst (cons (ssname value (setq item (1- item))) lst))
         ) ;_ end repeat

  lst
;;;  (if selset 
;;;    (vl-remove-if 'listp (mapcar 'cadr (ssnamex selset))) 
;;;    )
  ) ;_ end of defun 

;|============================================================================= 
*    Функция преобразования набора, полученного через (ssget), в список 
* vla-примитивов. 
*    Параметры вызова: 
*   selset   набор примитивов 
*    Примеры вызова: 
(lib:conv-pickset-to-vlalist (ssget)) 
=============================================================================|; 
(defun lib:conv-pickset-to-vlalist(selset) 
  (if selset 
    (mapcar 'vlax-ename->vla-object
            (lib:conv-pickset-to-list selset) 
            ))) ;_ end of defun

;   Возвращает список из двух 3d точек
;   '((левая нижняя) (правая верхняя))
;
    (defun lst-getboundingbox (lst)
      (vl-load-com)
      (if (listp lst)
        ((lambda (x)
           (list
             (apply
               (function mapcar)
               (cons (function min) (mapcar (function car) x))
             ) ;_  apply
             (apply
               (function mapcar)
               (cons (function max) (mapcar (function cadr) x))
             ) ;_  apply
           ) ;_  list
         ) ;_  lambda
          (vl-remove-if
            (function null)
            (mapcar
              (function
                (lambda (x / minp maxp)
                  (if (not (vl-catch-all-error-p
                             (vl-catch-all-apply
                               (function vla-getboundingbox)
                               (list x 'minp 'maxp)
                             ) ;_  vl-catch-all-apply
                           ) ;_  vl-catch-all-error-p
                      ) ;_  not
                    (list (vlax-safearray->list minp)
                          (vlax-safearray->list maxp)
                    ) ;_  list
                  ) ;_  if
                ) ;_  lambda
              ) ;_  function
              lst
            ) ;_  mapcar
          ) ;_  vl-remove-if
        )
      ) ;_  if
    ) ;_ end of defun
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 11.12.2010 в 14:07. Причина: новая версия
VVA вне форума  
 
Автор темы   Непрочитано 10.12.2010, 15:22
#18
Shaft

отдел открытых горных работ
 
Регистрация: 06.05.2009
Новокузнецк
Сообщений: 124


VVA, супер!
На и раз это тестовая версия, то хочу высказать парочку замеченных неточностей:

На скриншотах я постарался выделить проблемные места.
Красная линия это результат работы программы
Зеленая линия это желаемый/требуемый рузультат

Для дотягивания до идеала, хотелось бы чтобы были поправленны следующие моменты:
1 - совпадение вершин контура с вершинами обводимых линий
2 - корректно "обводить" дуговые сегменты
3 - отучить программу пропускать некоторые участки (рис 1 и 3) впринципе тоже что и п.1
4 - или недоводит (рис 2)тоже можно отнести к п.1
Миниатюры
Нажмите на изображение для увеличения
Название: 1.jpg
Просмотров: 198
Размер:	17.5 Кб
ID:	49799  Нажмите на изображение для увеличения
Название: 2.png
Просмотров: 182
Размер:	3.7 Кб
ID:	49801  Нажмите на изображение для увеличения
Название: 3.jpg
Просмотров: 167
Размер:	7.5 Кб
ID:	49802  
Shaft вне форума  
 
Непрочитано 10.12.2010, 19:14
1 | #19
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Обновил код в #17
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 13.12.2010, 05:24
#20
Shaft

отдел открытых горных работ
 
Регистрация: 06.05.2009
Новокузнецк
Сообщений: 124


VVA, проверил обновленный код из #17, все ошибки описаные мною в #18 остались. Только обрисовка внешних границ улучшлась лишь в некоторых местах маленькие расхождения. А в 95% идет полное совпадение по вершинам.

P.s. Но если удастся избавиться от проблемок из #18, то это будет бесценный инструмент!!!
Надеюсь не только для меня

Последний раз редактировалось Shaft, 13.12.2010 в 06:54.
Shaft вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Создание внешнего контура на основе выделенного набора примитивов

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание графика в AutoCAD на основе txt или xls файла Red Nova Программирование 116 06.04.2017 09:20
Создание блоков из примитивов gest AutoCAD 11 26.11.2009 10:57
создание набора с помощью activeX Composter Программирование 3 15.05.2009 00:11
Лисп присадки мебельной фурнитуры Скулачёв А. LISP 18 20.08.2008 13:59