Новый ZWCAD 2017
dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

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

соединить динамические блоки отрезками по кротчайшему пути

Версия для печати
 
Ответ
Опции темы Поиск в этой теме
Непрочитано 06.09.2010, 09:06 #1
соединить динамические блоки отрезками по кротчайшему пути
gizmo_zx
 
Проектировщик ЭО,ЭМ, ЭОС
 
Нижний Новгород
Регистрация: 18.07.2007
Сообщений: 190
Отправить сообщение для gizmo_zx с помощью ICQ Отправить сообщение для gizmo_zx с помощью Skype™

gizmo_zx вне форума Вставить имя

Добрый день.
Нужно объединить несколько блоков (динамических) отрезками.
1) выбрать блоки.
2) указать последнюю точку.
3) провести отрезки от самого дальнего блока к более ближнему и.т.д.

Блоки одного имени.
Хотелось бы увидеть это на VBA (но сильно не надеюсь).
Lispe можно по подробней в плане комментариев.

Миниатюры
Нажмите на изображение для увеличения
Название: 1.jpg
Просмотров: 130
Размер:	13.6 Кб
ID:	44794  

Просмотров: 3860
 
Непрочитано 06.09.2010, 10:41
#2
nikе

конструктор Лего
 
Регистрация: 21.10.2005
Краснодар
Сообщений: 200


Эту задачу можно решить используя C++ библиотеку ANN - Approximate Nearest Neighbor Library (Поиск ближайшего соседа). На С++ существует много библиотек, поэтому легче научиться применять С++, чем выдумывать велосипеды на Лиспе или VBA.
nikе вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 06.09.2010, 10:52
#3
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,837


выдумывать пришлось 5 строчек кода: (попробуй на с++ такое исполнить с использованием любых библиотек):
Код:
[Выделить все]
(vl-load-com)
;************ библиотечные ***************
(defun sstolist (ss / i lst); конвертирует набор в список
(setq i 0)
(if ss
(repeat (sslength ss)
(setq lst (append lst (list (ssname ss i))) i (1+ i))
));end of repeat & if
lst
);end of sstolist

(defun pln (lst c); создает полилинию по списку вершин lst, c - nil/T - разомкн/замкнт или '(с слой цвет).
(entmakex (append
(list (cons 0 "LWPOLYLINE")(cons 100 "AcDbEntity")(cons 100 "AcDbPolyline") (cons 90 (length lst)))
(if (= (type c) 'list)
(vl-remove nil (list
(if (car c) (cons 70 1) (cons 70 0))
(if (cadr c) (cons 8 (cadr c)))
(if (caddr c) (cons 62 (caddr c)))
));end of list & vl-remove
(list (if c (cons 70 1) (cons 70 0)))
);end of if
(mapcar '(lambda (x) (cons 10 x)) lst)
));end of apend & entmakex
);end of pln

(defun cod (cd obj) ; возращает код cd примитива obj.
(if (and obj (= (type obj) 'ename))
(cdr (assoc cd (entget obj)))
));end of cod

;********** сама программа
(defun c:test ()
((lambda (lst pt)
(pln (vl-sort (cons pt lst) '(lambda (a b) (> (distance pt a) (distance pt b)))) nil)); чертит полилинию от дальней к ближней
(mapcar '(lambda (ent) (cod 10 ent))(sstolist (ssget (list (cons 0 "insert"))))); выбирает блоки и преобразует в список точек вставки
(getpoint "\nLast point "))); запрашивает точку
p.s. запускать командой test
p.p.s не заметил - соединяет не отрезками - а полилинией - если принципиально - могу переделать, просто обычно, наоборот, полилинией удобней.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 06.09.2010, 12:47
#4
gizmo_zx

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 190
Отправить сообщение для gizmo_zx с помощью ICQ Отправить сообщение для gizmo_zx с помощью Skype™


задачка немного посложнее...
полилинию разрезать боками и к конечной точке подвести "под прямым углом (по катетам прямоугольного треугольника)" (сейчас по кротчайшей траектории )
gizmo_zx вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 06.09.2010, 13:01
#5
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,418


Три клика с опцией Orto. Нафига какие-то программы?
Цитата:
полилинию разрезать боками
Засунь в блок Wipeout и ничего не надо будет разрезать
Nike вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 06.09.2010, 13:14
#6
gizmo_zx

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 190
Отправить сообщение для gizmo_zx с помощью ICQ Отправить сообщение для gizmo_zx с помощью Skype™


Цитата:
Сообщение от Nike Посмотреть сообщение
Три клика с опцией Orto. Нафига какие-то программы?
а если блоков 50 или 150...

Цитата:
Сообщение от Nike Посмотреть сообщение
Засунь в блок Wipeout и ничего не надо будет разрезать
А вот про ето можно по подробнее
gizmo_zx вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 06.09.2010, 13:19
#7
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,418


Цитата:
Сообщение от gizmo_zx Посмотреть сообщение
а если блоков 50 или 150...
если они в одной линии - те же три клика. А если разбросаны - тут никакая программа не поможет
Про "Wipeout" - поищи тему "Хитрый блок"
Nike вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 06.09.2010, 13:22
1 | #8
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,837


Цитата:
Сообщение от gizmo_zx Посмотреть сообщение
полилинию разрезать боками
это что такое?
з.ы. даю еще одну потытку расписать полностью все условия - (типа по катетам прямоугольного треугольника), еще 1 раз перепешу программу (в разумных пределах) - не более, чужое время надо тоже ценить.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 06.09.2010 в 13:29.
Дима_ вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 06.09.2010, 13:49
#9
gizmo_zx

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 190
Отправить сообщение для gizmo_zx с помощью ICQ Отправить сообщение для gizmo_zx с помощью Skype™


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

2)мне бы в твоем лиспе алгоритм сортировки блоков понять и по возможности поменять
gizmo_zx вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 06.09.2010, 14:05
#10
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,837


Цитата:
Сообщение от gizmo_zx Посмотреть сообщение
все супер, линию резать не надо (и это хорошо)
линия к "последней точке" рисуется по кратчайщему пути (гипотенузе), а мне бы хотелось по двум катетам.

2)мне бы в твоем лиспе алгоритм сортировки блоков понять и по возможности поменять
1. У каждой гипотинузы 2 варианта катетов (вначале по x, потом по y; или наоборот), какие использовать?
2. (vl-sort (cons pt lst) '(lambda (a b) (> (distance pt a) (distance pt b))))

сортирует список (vl-sort)
из точек вставки блока + запрошенная точка (cons pt lst)
по порядку убывания (>)
расстояния (distance)
между точкой вставки блока (a и b)
и запрошенной точкой pt
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 06.09.2010, 14:12
#11
gizmo_zx

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 190
Отправить сообщение для gizmo_zx с помощью ICQ Отправить сообщение для gizmo_zx с помощью Skype™


А можно, как на картинке, "в продолжении текущей линии"
(в данном примере линия продлевается горизонтально, а затем вертикально)
gizmo_zx вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 06.09.2010, 14:24
#12
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,837


а если она не горизонтальна и не вертикальна (под углом)?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 06.09.2010, 14:35
#13
gizmo_zx

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 190
Отправить сообщение для gizmo_zx с помощью ICQ Отправить сообщение для gizmo_zx с помощью Skype™


http://forum.dwg.ru/attachment.php?a...4&d=1283749424
тогда как на рисунке, по катетам
gizmo_zx вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 06.09.2010, 14:39
#14
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,418


gizmo_zx , аблоки вручную растыркиваешь или тоже программно? Может быть линии рисовать одновременно с расстановкой блоков?
Nike вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 06.09.2010, 14:42
1 | #15
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,837


короче делаю если "строго" вертикальны (допуск 0.0001) - рисует вначале по оси Y, затем по X, во всех других случаях наоборот:
Код:
[Выделить все]
(defun c:test ()
((lambda (lst pt)
(pln 
((lambda (lst)
(reverse (cons pt (cons (if (equal (caar lst) (car (cadr lst)) 0.0001)
						(list (caar lst) (cadr pt))
						(list (car pt) (cadr (car lst))))
						lst))))
(vl-sort lst '(lambda (a b) (< (distance pt a) (distance pt b)))))
nil)); чертит полилинию от дальней к ближней
(mapcar '(lambda (ent) (cod 10 ent))(sstolist (ssget (list (cons 0 "insert"))))); выбирает блоки и преобразует в список точек вставки
(getpoint "\nLast point ")))
p.s. библиотечные функции в посте 3
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 06.09.2010, 15:28
#16
gizmo_zx

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 190
Отправить сообщение для gizmo_zx с помощью ICQ Отправить сообщение для gizmo_zx с помощью Skype™


Цитата:
Сообщение от Nike Посмотреть сообщение
gizmo_zx , аблоки вручную растыркиваешь или тоже программно? Может быть линии рисовать одновременно с расстановкой блоков?
расстановку в диалюксе делаю по нормам освещенности, экспортирую все хозяйство в автокад...
стало лень соединять каждый светильник проводом...
За хитрый блок огромное спасибо, просто супер... (только "поднять объекты слоя почему-то не получилось", вылезает контекстное меню (^C^C_-Layer;_set;0;Freeze;*;^C^C_-Layer;_Thaw;_освещение;;^C^C_Draworder;_All;;_Front;_-Layer;_Thaw;*;
(!не правильно задано ключевое слово. Задайте опцию. )
gizmo_zx вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 06.09.2010, 15:31
1 | #17
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,418


А зачем тебе объекты слоя поднимать? Ты линию опускай.

Вот тебе прогрраммулька, поднимающая все объекты, содержащие Wipeout
Код:
[Выделить все]
(defun c:wipeout-front (/ adoc *error* blk_cont blk_lst selset _cmdecho)
  (defun *error* (msg)
    (if _cmdecho
      (setvar "cmdecho" _cmdecho)
      ) ;_ end of if
    (vla-endundomark adoc)
    (princ msg)
    (princ)
    ) ;_ end of defun
 
  (sssetfirst nil nil)
 
  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (vlax-for blk_def (vla-get-blocks adoc)
    (if
      (and (equal (vla-get-islayout blk_def) :vlax-false)
          ;(not (wcmatch (vla-get-name blk_def) "`**"))
           (if (vlax-property-available-p blk_def 'isdynamicblock)
             (equal (vla-get-isdynamicblock blk_def) :vlax-false)
             (wcmatch (vla-get-name blk_def) "`**")
             ) ;_ end of if
           (setq
             blk_cont
              (vl-remove-if-not
                '(lambda (x)
                   (wcmatch (strcase (vla-get-objectname x))
                            "*WIPEOUT*"
                            ) ;_ end of wcmatch
                   ) ;_ end of lambda
                ((lambda (/ res)
                   (vlax-for sub blk_def (setq res (cons sub res)))
                   ) ;_ end of lambda
                 )
                ) ;_ end of vl-remove-if-not
             ) ;_ end of setq
           ) ;_ end of and
       (setq blk_lst (cons
                       (cond ((wcmatch (vla-get-name blk_def) "`**") "`**")
                             (t (vla-get-name blk_def))
                             ) ;_ end of cond
                       blk_lst
                       ) ;_ end of cons
             ) ;_ end of setq
       ) ;_ end of if
    ) ;_ end of vlax-for
  (if blk_lst
    (progn
      (setq blk_lst  ((lambda (/ res)
                        (foreach item blk_lst
                          (if (not (member item res))
                            (setq res (cons item res))
                            ) ;_ end of if
                          ) ;_ end of foreach
                        res
                        ) ;_ end of lambda
                      )
            selset   (ssget
                       "_X"
                       (list
                         '(0 . "INSERT")
                         (cons
                           2
                           ((lambda (/ res)
                              (strcat
                                (car blk_lst)
                                (apply
                                  'strcat
                                  (mapcar '(lambda (x) (strcat "," x))
                                          (cdr blk_lst)
                                          ) ;_ end of mapcar
                                  ) ;_ end of apply
                                ) ;_ end of strcat
                              ) ;_ end of lambda
                            )
                           ) ;_ end of cons
                         ) ;_ end of list
                       ) ;_ end of ssget
            _cmdecho (getvar "cmdecho")
            ) ;_ end of setq
      (setvar "cmdecho" 0)
      (command "_.draworder" selset "" "_f")      
;;;      (vla-regen adoc acallviewports)
      ) ;_ end of progn
    ) ;_ end of if
  (if _cmdecho
    (setvar "cmdecho" _cmdecho)
    ) ;_ end of if
  (vla-endundomark adoc)
  (command "_regen")
  (princ)
  ) ;_ end of defun

Последний раз редактировалось Nike, 06.09.2010 в 15:53. Причина: код подчистил
Nike вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 06.09.2010, 15:58
#18
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,837



Цитата:
стало лень соединять каждый светильник проводом...
Уважаемый gizmo_zx, ну коли ты сам не очень понимаешь что тебе нужно, зачем ты пишешь:
Цитата:
провести отрезки от самого дальнего блока к более ближнему
напиши сразу для чего тебе соединять блоки, тебе надо совсем не к "более ближнему", а кротчайшим маршрутом соеденить все точки от определенного начала (конца). Ты-ж не как на рисунке провода соеденяешь? А программа (которая по твоему описанию написанна) - именно так. Короче как сотрировку изменить надо додумывай сам (см. п. 8), там строк 5 еще добавляеться.
Миниатюры
Нажмите на изображение для увеличения
Название: пример.JPG
Просмотров: 103
Размер:	17.8 Кб
ID:	44828  
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 06.09.2010, 20:32
#19
Елпанов Евгений

BIM
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,437
Отправить сообщение для Елпанов Евгений с помощью MSN Отправить сообщение для Елпанов Евгений с помощью Skype™


Кратчайший маршрут, проходящий через облако точек, соединяя все кратчайшей линией, это тема отдельного разговора.
Пример моего решения, можно посмотреть http://www.theswamp.org/index.php?topic=30434.0 но для отображения вложенных кодов и изображений, там необходима регистрация...
__________________
Скоро умные проги некому писать будет, все будут ответ в интернете искать...
Елпанов Евгений вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > соединить динамические блоки отрезками по кротчайшему пути

Опции темы Поиск в этой теме
Поиск в этой теме:

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

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамические блоки при копировании перестают быть динамическими. *Voland* AutoCAD 11 04.07.2012 10:51
Ищу электронный учебник по Autocad 2010 (главу динамические блоки) Anton_Br Поиск литературы, чертежей, моделей и прочих материалов 16 17.03.2011 14:10
Почему динамические блоки теряют свои свойства? adv87_ AutoCAD 22 04.03.2011 13:24
Глюк. Динамические блоки становится статическим! b_anton AutoCAD 10 24.06.2008 16:27
HELP!!! Динамические блоки? Bdod AutoCAD 13 07.04.2007 08:59

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||


Размещение рекламы