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

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

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

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

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

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

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

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

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


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

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


выдумывать пришлось 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
Нижний Новгород
Сообщений: 256
<phrase 1= Отправить сообщение для gizmo_zx с помощью Skype™


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

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


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

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


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

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

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


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

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


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

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

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


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

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

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


Цитата:
Сообщение от 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
Нижний Новгород
Сообщений: 256
<phrase 1= Отправить сообщение для gizmo_zx с помощью Skype™


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

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


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

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 256
<phrase 1= Отправить сообщение для 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,989


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

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


короче делаю если "строго" вертикальны (допуск 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
Нижний Новгород
Сообщений: 256
<phrase 1= Отправить сообщение для 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,989


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

Вот тебе прогрраммулька, поднимающая все объекты, содержащие 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,840



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

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


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

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

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


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