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

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Как находить незамыкания границ площадных объектов, находить "свободные концы"

Как находить незамыкания границ площадных объектов, находить "свободные концы"

Ответ
Поиск в этой теме
Непрочитано 05.12.2014, 04:01 #1
Как находить незамыкания границ площадных объектов, находить "свободные концы"
АлексЮстасу
 
топограф, технолог
 
Москва
Регистрация: 24.05.2009
Сообщений: 3,072

Нужен инструмент, который мог бы находить, отмечать конечные точки линейных элементов, не привязанные к другим линейным элементам.
Например, как это делает BOUNDARY, отмечая такие точки. Только сама BOUNDARY и выдаваемые ей результаты на мой взгляд не пригодны для использования во многих случаях.
Избавляться от мелких разрывов можно с помощью разных инструментов, в т.ч. PL-JOIN, задав в нем допуск. Но, во-первых, процесс соединения часто желательно контролировать, т.е. предварительно увидеть разрывы, во-вторых, собственно сшивать элементы часто не следует, в-третьих, так нельзя ни найти, ни избавиться от "свободных концов" вне реальных допусков.
Контуры бывают очень большими, состоят из множества элементов, могут иметь очень сложные формы, и на поиск разрывов в них уходит слишком много времени.

Миниатюры
Нажмите на изображение для увеличения
Название: Свободные_концы.png
Просмотров: 90
Размер:	3.4 Кб
ID:	140052  

__________________
количество моих сообщений не говорит о знании Автокада
Просмотров: 4352
 
Непрочитано 10.12.2014, 13:48
1 | #2
Valery Brelovsky

Инженер дорожник
 
Регистрация: 22.10.2007
Израиль
Сообщений: 1,859


Незнаю может здесь что подойдёт.
http://www.caduser.ru/forum/index.ph...D=44&TID=20184
Valery Brelovsky вне форума  
 
Автор темы   Непрочитано 10.12.2014, 18:02
#3
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,072


Цитата:
Сообщение от Valery Brelovsky Посмотреть сообщение
может здесь что подойдёт
Спасибо! В принципе - то, что нужно.
На 2012, правда, программа не пошла. Но на 2008 сработала.
Понятно, что нужно бы для версий новее, нужна возможность управлять размерами меток, возможность использовать предварительный выбор.
Еще программа отмечает у полилиний с признаком замкнутости начала-концы, если они не совпадают. Это, вероятно, лишнее?

Но локоть как никогда уже близок
__________________
количество моих сообщений не говорит о знании Автокада

Последний раз редактировалось АлексЮстасу, 10.12.2014 в 18:36.
АлексЮстасу вне форума  
 
Непрочитано 11.12.2014, 08:20
#4
Valery Brelovsky

Инженер дорожник
 
Регистрация: 22.10.2007
Израиль
Сообщений: 1,859


В принципе то что было. Старая программа я не посмотрел на время создания. Но может быть там по ссылке пообщатся, автор и поправит.
Valery Brelovsky вне форума  
 
Непрочитано 14.12.2014, 09:01
#5
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Я тут вспомнил про еще одну программу
Одна из заявленных возможностей:
Цитата:
Устранение разрывов в узлах сопряжения различных комбинаций примитивов (в том числе образующих замкнутые области).
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 14.12.2014, 15:36
#6
sertor

Геодезист
 
Регистрация: 23.05.2012
Ухта
Сообщений: 1,377


АлексЮстасу, а эту команду случайно не упустили? (Civil 3D/Map 3D)
Миниатюры
Нажмите на изображение для увеличения
Название: Image 1.png
Просмотров: 56
Размер:	17.1 Кб
ID:	140602  
__________________
Как-то так.
sertor вне форума  
 
Автор темы   Непрочитано 14.12.2014, 16:09
#7
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,072


Цитата:
Сообщение от VVA Посмотреть сообщение
Я тут вспомнил про еще одну программу
Думаю, что оптимален вариант специальной команды. Отдельной или в составе набора команд для близких задач. Чтобы поиск разрывов можно было делать без особого ломания головы над многими параметрами. И у автора программы подход к оптимизации не топологический, т.е. не для всего годится.
Цитата:
Сообщение от sertor Посмотреть сообщение
а эту команду случайно не упустили? (Civil 3D/Map 3D)
Да, команде поиска свободных концов самое место именно здесь - в Drawing cleanup! Но свободные концы - все-таки отдельная задача, у нее другие критерии, чем у Продолжать недоводы или Сводить узлы в один. Конкретно: команда Продолжать недоводы не сработает на сонаправленных элементах, не найдет разрывы больше допуска. А больший допуск (какой?) ставить чревато - найдет слишком много ненужного. Так же не найти только висячие концы, разрывы с помощью Сводить узлы в один. Для поиска свободных концов допуск вообще не нужен.
Offtop: Этот случай - как раз хороший пример, что в самостоле засели саботажники и вредители. Ведь для топологической коррекции, для создания площадных объектов поиск разрывов - наипервейшее дело! И именно этой возможности в Drawing cleanup - специализированном и мощнейшем инструменте - и нет
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Автор темы   Непрочитано 04.12.2015, 20:05
#8
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,072


Всплыла еще одна программка на lisp - возможно, то, что нужно. Но ее последняя редакция аж 1998 года!
Загружается, но на вызов отвечает:
Цитата:
Требуется целое значение от 1 до 32767, или ключевое слово.
; ошибка: Функция отменена
Можно ли ее реанимировать?

Если удастся, то это может помочь еще одному страждущему с http://forums.autodesk.com/t5/visual...r/td-p/5934951.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 04.12.2015, 21:44
1 | #9
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


АлексЮстасу, В логику пока особо не вникал. Добавил легкие полилинии. Тестировал на 2013. Возможно потребуется добавить command-s для 2015 и выше
Тестируй
Код:
[Выделить все]
;| GAP.LSP locates and marks the ends of arcs, lines, and plines that are close
but not exactly coincident. Gaps are marked by drawing circles on the GAP layer.
You can select part of a drawing to check or press ENTER to check the whole drawing.
These are the distances to control how the gaps are located
Gap Limit = Gaps less than this, but more than fluff are marked
Fluff = Gaps less than this are not marked
Circle Size = Size of circle to mark gaps with
Original routine by McNeel & Associates
-----------------------------------------------------------------------
-----------------------------------------------------------------------
Modified by J. Tippit, SPAUG President 12/29/98
E-mail: cadpres@spaug.org
Web Site: http://www.spaug.org
-----------------------------------------------------------------------
-----------------------------------------------------------------------
Revisions:
12/29/98 Added ability to change Gap Limit, Fluff, & Circle Size
Added CMDECHO, UNDO, OSMODE, & CURLAY
Added a counter for the number of cicles that are drawn
and other misc. prompts
Changed the Gap layer to be RED

12/04/2015 VVA for dwg.ru
Web site: http://autocadtips1.com/2011/10/28/autolisp-find-and-mark-gaps/
posted http://forum.dwg.ru/showthread.php?p=1479981#post1479981
http://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/find-and-mark-gaps-lisp-repair/m-p/5939030/highlight/false#M337292
-----------------------------------------------------------------------
|;
(vl-load-com)
(defun dxf (x e)
  (if (listp e)
    (cdr (assoc x  e))
    (cdr (assoc x (entget e)))
    )
  )
 ;_ Removes entities other than line, pline, arc from a selection set
(defun checkss (ss / i)
  (setq i (sslength ss))
  (while (> i 0)
    (setq i (1- i))
    (setq ent (entget (ssname ss i)))
    (or
      (= "LINE" (dxf 0 ent))
      (= "POLYLINE" (dxf 0 ent))
      (= "LWPOLYLINE" (dxf 0 ent))
      (= "SPLINE" (dxf 0 ent))
      (= "ARC" (dxf 0 ent))
      (ssdel (ssname ss i) ss)
    ) ;_ end of or
  ) ;_ end of while
  (if (> (sslength ss) 0)
    ss
  ) ;_ end of if
) ;_ end of defun
 ;_ Returns the endpoints of lines, arcs and pines
(defun endsofent (ent / v e1 e2 ed )
  (setq ed (entget ent))
  (cond
    ((= "LINE" (dxf 0 ed))
     (list (dxf 10 ed) (dxf 11 ed))
    )
    ((= "ARC" (dxf 0 ed))
     (list
       (polar (dxf 10 ed) (dxf 50 ed) (dxf 40 ed))
       (polar (dxf 10 ed) (dxf 51 ed) (dxf 40 ed))
     ) ;_ end of list
    )
    ((= "POLYLINE" (dxf 0 ed))
     (setq v (entget (entnext (dxf -1 ed))))
     (setq e1 (dxf 10 v))
     (while (/= "SEQEND" (dxf 0 v))
       (setq e2 (dxf 10 v))
       (setq v (entget (entnext (dxf -1 v))))
     ) ;_ end of while
     (list e1 e2)
    )
    ((= "LWPOLYLINE" (dxf 0 ed))
     (setq e1 (dxf 10 ed))
     (setq e2 (dxf 10 (reverse ed)))
     (list e1 e2)
    )
    ((= "SPLINE" (dxf 0 ed))
     (list
       (vlax-curve-getstartpoint
         (vlax-ename->vla-object ent)
       ) ;_ end of vlax-curve-getStartPoint
       (vlax-curve-getendpoint
         (vlax-ename->vla-object ent)
       ) ;_ end of vlax-curve-getEndPoint
     ) ;_ end of list
    )
  ) ;_ end of cond
) ;_ end of defun
 ;_ gets a selection set of all entities near a point
(defun ssat (pt dist)
  (ssget "_c"
         (list (- (car pt) dist) (- (cadr pt) dist))
         (list (+ (car pt) dist) (+ (cadr pt) dist))
  ) ;_ end of ssget
) ;_ end of defun
 ;_ Looks through a selection set and finds ends near but not at ends
 ;_ of other entities
(defun markgaps (ss / i ends ent)
  (setq i (sslength ss))
  (while (> i 0)
    (setq i (1- i))
    (setq ent(ssname ss i))
    (setq ends (endsofent ent))
    (princ ".")
 ;_ (princ "\n")
 ;_ (princ (car ends))
 ;_ (princ " -- ")
 ;_ (princ (cadr ends))
    (endsnear (car ends) gaplimit ent ends)
    (endsnear (cadr ends) gaplimit ent ends)
  ) ;_ end of while
) ;_ end of defun
(defun circle (pt dia)
  (entmakex
         (list
            '(0 . "CIRCLE")
            '(8 . "GAP")
            (cons 10 pt)
            (cons 40 (* dia 0.5))
            '(62 . 1)
         )
         )
  (if (= CNT nil)
    (setq CNT 1)
    (setq CNT (1+ CNT))
  ) ;_ end of if
) ;_ end of defun
 ;_ Finds the entities near a point and marks their ends if they
 ;_ are also near the point
(defun endsnear (pt dist this thisends / ent ends sse j d)
  (setq thisends (car(vl-remove-if '(lambda(x)(equal x pt 1e-8)) thisends)))
  (if (and (setq sse (ssat pt dist)) 
           (eq (type sse) 'PICKSET)
           (setq sse (ssdel this sse))
           (> (sslength sse) 0)
        )   
    (progn
      (setq j (sslength sse))
      (while (> j 0)
        (setq j (1- j))
        (setq ent (ssname sse j))
        (if
          (and
            (setq ends (endsofent ent))
            (not
            (vl-some '(lambda(y)(equal y 0.0 1e-8))
              (append
                (mapcar '(lambda(x)(distance pt x)) ends)
                (mapcar '(lambda(x)(distance thisends x)) ends)
                )
              )
            )
            
            )
           (progn
             (setq d (distance (car ends) pt))
             (if
               (and
                 (not (equal d 0.0 1e-8))
                 (< d gaplimit)
               ) ;_ and
                (circle pt circlesize)
             ) ;_ if
             (setq d (distance (cadr ends) pt))
             (if
               (and
                 (not (equal d 0.0 1e-8))
                 (< d gaplimit)
               ) ;_ and
                (circle pt circlesize)
             )
           ) ;_ end of progn
        ) ;_ end of if
      ) ;_ end of while
    ) ;_ end of progn
  ) ;_ end of if
) ;_ end of defun
 ;_ Main control function
(defun c:GAP (/ ss)
  (setvar "cmdecho" 0)
  (command "_.undo" "_begin")
  (setq #OSMOD (getvar "osmode"))
  (setvar "osmode" 0)
  (setq #CURLA (getvar "clayer"))
  (setq CNT nil)
  (or gaplimit (setq gaplimit 1.0))
  (initget 6)
  (if (setq tmp (getdist (strcat "\nSet Gap Limit <" (rtos gaplimit 2 1) ">: ")))
    (setq gaplimit tmp)
    )
  (or *fluff* (setq *fluff* 0.000001))
  (initget 6)
  (if (setq tmp (getdist (strcat "\nSet Fluff <" (rtos *fluff* 2 8) ">: ")))
    (setq *fluff* tmp)
    )
  (initget 6)
  (or circlesize (setq circlesize 2.0))
  (if (setq tmp (getdist (strcat "\nSet circle Diameter <" (rtos circlesize 2 1) ">: ")))
    (setq circlesize tmp)
    )  
  (or
    (and
      (setq ss (ssget "_I"))
      (setq ss (checkss ss))
    ) ;_ end of and
    (progn
    (SSSETFIRST nil nil)
    (setq ss (ssget 
                    '((-4 . "<OR")
                      (0 . "LINE")
                      (0 . "ARC")
                      (0 . "POLYLINE")
                      (0 . "LWPOLYLINE")
                      (0 . "SPLINE")
                      (-4 . "OR>")
                     )
             ) ;_ end of ssget
    ) ;_ end of setq
    )
  ) ;_ end of or
  (princ "\nChecking for Gaps - please wait")
  (if (and ss (eq (type ss) 'PICKSET) (> (sslength ss) 0))
    (markgaps ss)
  ) ;_ end of if
  (princ "done!")
  (if (/= CNT nil)
    (princ (strcat "\n" (itoa CNT) " Circles drawn."))
    (princ "\nNo Gaps found.")
  ) ;_ end of if
  (setvar "clayer" #CURLA)
  (setvar "osmode" #OSMOD)
  (command "_.undo" "_e")
  (setvar "cmdecho" 1)
  (princ)
) ;_ end of defun
(prompt "\nLOCATE GAPS is loaded... type GAP to start!")
(princ)
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 09.12.2015 в 14:28. Причина: Внес изменения по тз #15
VVA вне форума  
 
Автор темы   Непрочитано 04.12.2015, 22:03
#10
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,072


Цитата:
Сообщение от VVA Посмотреть сообщение
Добавил легкие полилинии. Тестировал на 2013. Возможно, потребуется добавить command-s для 2015 и выше
На работе на 2012-м работает!
Дома проверю на 2016-м.
Что такое легкие полилинии?
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 04.12.2015, 23:15
1 | #11
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Что такое легкие полилинии?
правильнее, наверное, назвать компактные
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 05.12.2015, 05:23
#12
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,072


Спасибо и за реанимацию лиспа, и за просвещение!
Лисп работает у меня и на 2016-м.

С человеком с другого форума случился испорченный телефон из-за моего нулевого английского. У него лисп почему-то работал. Его заботят ложные пометки разрывов.
Похоже, лисп хуже всего обрабатывает отрезки - на многих их нормальных соединениях выдает ложные разрывы. Но не на всех.
Еще лисп считает разрывом расстояние между концами отрезков или полилиний, даже если эти концы соединены другим отрезком или полилинией.
И лисп не учитывает признак замкнутости у полилиний - если последний сегмент попадает в допуск, то тоже его пометит как разрыв.
Возможно, что авторы что-то подобное за программой знали, иначе зачем бы они вводили "Fluff" - допуск не на максимальные, а на минимально обрабатываемые разрывы?..

Это не говоря о др. вопросах к программке: не обрабатывает предварительный выбор, на Enter при запросе выбора объектов прекращает работу с ошибкой, если указать необрабатываемые элементы (наудачу попробовал сплайны), то пометила ошибки для арок-окружностей, проверяемых мной перед этим.
Приложил тестовый файл от автора вопроса с добавленными мной дугами и сплайнами.
Вложения
Тип файла: dwg
DWG 2004
GAP-Test_1.dwg (60.5 Кб, 553 просмотров)
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 05.12.2015, 10:17
#13
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Его заботят ложные пометки разрывов.
Да. я читал. По совету Kent1Cooper внес небольшие изменения в #9
Я именно реанимиравал программу, "заставил" ее работать не только в английском автокаде, добавил обработку полилиний, которых в 1998 году не было.
По поводу остальных вопросов нужно разбирать алгоритм.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 07.12.2015, 16:01
1 | #14
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Это не говоря о др. вопросах к программке: не обрабатывает предварительный выбор, на Enter при запросе выбора объектов прекращает работу с ошибкой, если указать необрабатываемые элементы (наудачу попробовал сплайны), то пометила ошибки для арок-окружностей, проверяемых мной перед этим.
Обновил #9
Тестировал на GAP-Test_1.dwg с установками
Цитата:
Команда: gap
Set Gap Limit <0.1>:
Set Fluff <0.0001>:
Set Circle Size <2.0>:
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 08.12.2015, 22:02
#15
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,072


Цитата:
Сообщение от VVA Посмотреть сообщение
Обновил #9
Тестировал на GAP-Test_1.dwg с установками
Цитата:
Команда: gap
Set Gap Limit <0.1>:
Set Fluff <0.0001>:
Set Circle Size <2.0>:
Gap Limit, наверное, описка, не 0.1, а 1.0? У меня на 0.1 - "No Gaps found.".
Я проверял при допуске 1.0.

Помечаются как разрывы короткие элементы, длиной меньше Limit. Понятно, что это крайние, вырожденные случаи, и потому спорные.
Но в том числе помечаются и короткие элементы при примыканиях к ним др. элементов. Т.е. существующие элементы считаются разрывами.

Еще проверил вариант параллельных полилиний - почему-то отметились только одни концы.

В целом из исходного кода получается вариант программки для "чистых разрывов", т.е. если есть мин. два несведенных конца.
Вариант от hmsilva воспринимает и один конец + проходящий на расстоянии от него элемент как разрыв. Даже если у этого элемента рядом нет ни вершин, ни концов.
Оба достаточно последовательны...
Миниатюры
Нажмите на изображение для увеличения
Название: GAP-Test_polyline_spline-short.png
Просмотров: 17
Размер:	36.6 Кб
ID:	161873  Нажмите на изображение для увеличения
Название: GAP-Test_polyline_spline-parallel.png
Просмотров: 17
Размер:	18.8 Кб
ID:	161874  
Вложения
Тип файла: dwg
DWG 2004
GAP-Test_polyline_spline (1).dwg (384.5 Кб, 310 просмотров)
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 09.12.2015, 14:29
#16
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


АлексЮстасу, Обновил #9. Внес кое-какие изменения в логику
На примере из #15 проверял с установками
Цитата:
Команда: gap
Set Gap Limit <0.7>: 0.7
Set Fluff <0.00000100>: 0.000001
Set circle Diameter <1.0>: 1
Выберите объекты: Противоположный угол: найдено: 79
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 09.12.2015, 18:52
#17
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,072


Цитата:
Сообщение от VVA Посмотреть сообщение
АлексЮстасу, Обновил #9. Внес кое-какие изменения в логику
На примере из #15 проверял с установками
Я делал с Gap Limit 1.0.
По-моему, если к концам элементов примыкают другие элементы, то это же не разрывы? Даже если длина таких элементов меньше Gap Limit.

Ваш вариант программы ищет только разрывы концов элементов. Вариант hmsilva ищет еще и разрывы между концами и проходящими рядом элементами. При этом программа hmsilva использует zoom и пр.
Это связано друг с другом?
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Как находить незамыкания границ площадных объектов, находить "свободные концы"



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Аттестация в Минрегионе по негосударственной экспертизе Людмила Охр Прочее. Архитектура и строительство 350 14.02.2015 17:50