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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp. Копирование объектов между точками

Lisp. Копирование объектов между точками

Ответ
Поиск в этой теме
Непрочитано 08.06.2010, 23:33 #1
Lisp. Копирование объектов между точками
Yuzer
 
Мозговой штурм
 
Рідна ненька - Україна, Харків
Регистрация: 26.10.2008
Сообщений: 5,705

Здравствуйте.
Сегодня столкнулся с трудностью: между двумя точками на одинаковом расстоянии нужно вставить n объектов.
Рисую линию, делю ее и вставляю по точкам объекты. Процесс долгий, тем более если количество объектов потом нужно менять (т.е. я их удаляю и заново повторяю процедуру).
Подскажите, пожалуйста, решение.
Просмотров: 8840
 
Непрочитано 08.06.2010, 23:52
#2
Nike

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


не могу понять, чем тебя не устраивает _divide
Nike вне форума  
 
Автор темы   Непрочитано 08.06.2010, 23:53
#3
Yuzer

Мозговой штурм
 
Регистрация: 26.10.2008
Рідна ненька - Україна, Харків
Сообщений: 5,705


Всю цепочку действий нужно повторять в случае изменения числа объектов
Yuzer вне форума  
 
Непрочитано 08.06.2010, 23:55
#4
Nike

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


ну удалил старые и снова - (command "_divide" Линия "_b" Блок Промежуток)
делов то..
Nike вне форума  
 
Автор темы   Непрочитано 08.06.2010, 23:57
#5
Yuzer

Мозговой штурм
 
Регистрация: 26.10.2008
Рідна ненька - Україна, Харків
Сообщений: 5,705


Так я снова получу точки, в которые нужно вставить заново объекты
Yuzer вне форума  
 
Непрочитано 09.06.2010, 00:10
#6
Nike

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


Опция "_b" вставляет вместо точек блоки, а блоками ты можешь распределить любую фигуру
Nike вне форума  
 
Автор темы   Непрочитано 09.06.2010, 00:37
#7
Yuzer

Мозговой штурм
 
Регистрация: 26.10.2008
Рідна ненька - Україна, Харків
Сообщений: 5,705


Nike, меня устроит: выбрать объект/указать 2 точки/указать число раз
Yuzer вне форума  
 
Непрочитано 09.06.2010, 00:40
#8
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


А что за объекты расставляешь?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.06.2010, 00:42
#9
Yuzer

Мозговой штурм
 
Регистрация: 26.10.2008
Рідна ненька - Україна, Харків
Сообщений: 5,705


когда как: отрезки, круги, блоки, в общем разное...
Yuzer вне форума  
 
Непрочитано 09.06.2010, 01:03
#10
Nike

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


попробуй это (не помню откуда и чье)
Код:
[Выделить все]
(defun C:MASSIV1 ()
  (setvar "cmdecho" 0)
  (setvar "osnapcoord" 1)
  (prompt "\nВыберите объекты: ")
  (setq old_error *error*)
  (setq *error* ERR_)
  (setq
    LL (ssget)
    W  (entget (ssname LL 0))
    TN (cdr (assoc 10 W))
    S  (getreal "\n Шаг копирования: ")
  ) ;setq
  (setq
    UG (getangle "\n Направление копирования: <горизонтально> ")
  ) ;
  (if (= UG nil)
    (setq UG 0)
  ) ;if
  (setq
    L  (getdist "\n Участок копирования: ")
    Q  (fix (/ L S))
    TK (polar TN UG S)
    N  2
  ) ;_ end of setq
  (command "_.undo" "_be")
  (repeat Q
    (command "_.copy" LL "" TN TK)
    (setq
      S1 (* S N)
      TK (polar TN UG S1)
      N  (+ 1 N)
    ) ;_ end of setq
  ) ;repeat
  (command "_.undo" "_end")
  (setq *error* old_error)
)   ;setq
(defun ERR_ (msg)
  (command "_.undo" "_end")
  (setq *error* old_error)
  (princ)
) ;_ end of defun
Nike вне форума  
 
Автор темы   Непрочитано 09.06.2010, 01:10
#11
Yuzer

Мозговой штурм
 
Регистрация: 26.10.2008
Рідна ненька - Україна, Харків
Сообщений: 5,705


Спасибо. Offtop: Вещь явно понравилась
Но тут задается шаг, а мне нужно равномерное распределение.
Yuzer вне форума  
 
Непрочитано 09.06.2010, 01:15
#12
superkot007


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


Yuzer, есть "извратный" метод с привлечением Excel (ну Калькулятора на худой конец)
Разность координат точек делишь на n-1 (если требуется n объектов ВСЕГО). Получаешь т.н. "приращения" по осям. А дальше уже просто - через Массив задаешь расстояние между рядами/столбцами (для этого и требовалось считать "приращение"), угол наклона - и все...

В общем через ...., но когда "прямых" знаний не хватает, то вполне...
superkot007 вне форума  
 
Непрочитано 09.06.2010, 01:15
#13
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Создает точки, но модифицировать код, думаю, особого труда не составит:
Код:
[Выделить все]
(vl-load-com)

(defun test (/ adoc pt1 pt2 range step base ang)
  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (if (and (= (type (setq pt1 (vl-catch-all-apply
                                (function
                                  (lambda ()
                                    (getpoint "\nПервая точка <Отмена> : ")
                                    ) ;_ end of lambda
                                  ) ;_ end of function
                                ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'list
              ) ;_ end of =
           (= (type (setq pt2 (vl-catch-all-apply
                                (function
                                  (lambda ()
                                    (getpoint pt1 "\nВторая точка <Отмена> : ")
                                    ) ;_ end of lambda
                                  ) ;_ end of function
                                ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'list
              ) ;_ end of =
           (= (type (setq range (vl-catch-all-apply
                                  (function
                                    (lambda ()
                                      (getint "\nКоличество сегментов <Отмена> : ")
                                      ) ;_ end of lambda
                                    ) ;_ end of function
                                  ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'int
              ) ;_ end of =
           ) ;_ end of and
    (progn
      (setq step (/ (distance pt1 pt2) range)
            base pt1
            ang  (angle pt1 pt2)
            ) ;_ end of setq
      (repeat range
        (entmakex (list (cons 0 "POINT")
                        (cons 10 (setq base (polar base ang step)))
                        ) ;_ end of list
                  ) ;_ end of entmakex
        ) ;_ end of repeat
      ) ;_ end of progn
    ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.06.2010, 01:23
#14
Yuzer

Мозговой штурм
 
Регистрация: 26.10.2008
Рідна ненька - Україна, Харків
Сообщений: 5,705


Кулик Алексей, ну это уже не по моей части...

superkot007, действительно ацкий способ.
Yuzer вне форума  
 
Непрочитано 09.06.2010, 01:30
#15
Nike

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


Цитата:
Сообщение от Yuzer Посмотреть сообщение
Но тут задается шаг, а мне нужно равномерное распределение.
тогда так:
Код:
[Выделить все]
(defun C:MASSIV1 ()
  (setvar "cmdecho" 0)
  (setvar "osnapcoord" 1)
  (prompt "\nВыберите объекты: ")
  (setq old_error *error*)
  (setq *error* ERR_)
  (setq
    LL (ssget)
    W  (entget (ssname LL 0))
    TN (cdr (assoc 10 W))
    Q  (getint "\n Число копий: ")
  ) ;setq
  (setq
    UG (getangle "\n Направление копирования: <горизонтально> ")
  ) ;
  (if (= UG nil)
    (setq UG 0)
  ) ;if
  (setq
    L  (getdist "\n Участок копирования: ")
    S  (/ L Q)
    TK (polar TN UG S)
    N  2
  ) ;_ end of setq
  (command "_.undo" "_be")
  (repeat Q
    (command "_.copy" LL "" TN TK)
    (setq
      S1 (* S N)
      TK (polar TN UG S1)
      N  (+ 1 N)
    ) ;_ end of setq
  ) ;repeat
  (command "_.undo" "_end")
  (setq *error* old_error)
)   ;setq
(defun ERR_ (msg)
  (command "_.undo" "_end")
  (setq *error* old_error)
  (princ)
) ;_ end of defun
Nike вне форума  
 
Автор темы   Непрочитано 09.06.2010, 01:36
#16
Yuzer

Мозговой штурм
 
Регистрация: 26.10.2008
Рідна ненька - Україна, Харків
Сообщений: 5,705


Спасибо!!!
Yuzer вне форума  
 
Непрочитано 09.06.2010, 04:31
#17
Jonas

конструктор машиностроитель
 
Регистрация: 14.05.2007
Новосибирск
Сообщений: 893


Давно пользуюсь, не помню чъя программа но премного благодарен.
Вложения
Тип файла: lsp pl_copytr.LSP (3.0 Кб, 115 просмотров)
Jonas вне форума  
 
Автор темы   Непрочитано 09.06.2010, 08:48
#18
Yuzer

Мозговой штурм
 
Регистрация: 26.10.2008
Рідна ненька - Україна, Харків
Сообщений: 5,705


C этим лиспом не получается...
Подгрузил лисп, прописываю в строке: copytr
Цитата:
Команда: copytr
; ошибка: no function definition: VLAX-GET-ACAD-OBJECT
Что делаю не так?
Yuzer вне форума  
 
Непрочитано 09.06.2010, 09:38
#19
Jonas

конструктор машиностроитель
 
Регистрация: 14.05.2007
Новосибирск
Сообщений: 893


Может не перезагрузил Акад?
Jonas вне форума  
 
Непрочитано 09.06.2010, 09:48
#20
Елпанов Евгений

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


Цитата:
Сообщение от Jonas Посмотреть сообщение
Давно пользуюсь, не помню чъя программа но премного благодарен.
Внутри написано:
Цитата:
Copyright ©2004 Пётр Лоскутов (Alaspher)
Елпанов Евгений вне форума  
 
Непрочитано 09.06.2010, 10:18
#21
Diman111

промышл проектант
 
Регистрация: 26.05.2005
Изовсехщелей
Сообщений: 323


Чей лисп не помню - кажись с caduser из готовых программ брал. Могу и ошибаться.
Но делает то что вам надо - выбираем начальную и конечную точку и задаем количество копий.

Код:
[Выделить все]
(DEFUN C:dividecopy (/)
  (setvar "cmdecho" 0)
  (setq ss (ssadd))
  (setq ss (ssget))
  (setq pt1 (getpoint "\nНачальная точка: "))
  (setq pt2 (getpoint pt1 "\nКонечная точка: "))
  (setq dist (DISTANCE pt1 pt2))
  (setq alfa (ANGLE pt1 pt2))
  (setq N-divide (getint "\nКоличество копий: "))
  (setq dist-divide (/ dist (1+ N-divide)))
  (setq dist-divide-i dist-divide)
  (setq  i 1)
  (while (<= i N-divide)
    (setq Next-divide-pt (polar pt1 alfa dist-divide-i))
    (command "_.COPY" ss "" pt1 Next-divide-pt)
    (setq dist-divide-i (+ dist-divide-i dist-divide))
    (setq i (1+ i))
  )
  (setvar "cmdecho" 1)
  (princ)
)
Diman111 вне форума  
 
Непрочитано 09.06.2010, 11:23
#22
VVA

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


Цитата:
Сообщение от Yuzer Посмотреть сообщение
C этим лиспом не получается...
Подгрузил лисп, прописываю в строке: copytr

Что делаю не так?
Подредактируй немного файл. Добавь выделенное красным. И почитай здесь Что такое это (vl-load-com) ?
Код:
[Выделить все]
(defun c:copytr ()
  (vl-load-com)
  (pl:copytr)
  (princ)
)
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 10.06.2010 в 09:45.
VVA вне форума  
 
Автор темы   Непрочитано 09.06.2010, 14:35
#23
Yuzer

Мозговой штурм
 
Регистрация: 26.10.2008
Рідна ненька - Україна, Харків
Сообщений: 5,705


Спасибо огромное!
Yuzer вне форума  
 
Непрочитано 09.06.2010, 17:12
#24
VVA

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


Yuzer, Еще есть CopyM из Express Tools
Цитата:
Command: COPYM
Select objects: Select the objects to be copied
Base point: Specify a base point
Second point or [Repeat (last)/Divide/Measure/Array (dynamic)/Undo] <exit>:
Там и Divide и Measure. Исправленная версия от Алексея
Может будет интересен еще оди вариант: Alternative copy
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 09.06.2010, 20:52
#25
Yuzer

Мозговой штурм
 
Регистрация: 26.10.2008
Рідна ненька - Україна, Харків
Сообщений: 5,705


VVA, в экспресах удобно, что есть базовая точка. Спасибо - не знал.
Если честно, то не понял в чем отличие версии Алексея (проверял на скорую руку).
Alternative copy подгрузил, но запустить не получилось (результат появился при заключении в скобки (nc), хотя должно было запустится сразу:
Цитата:
Команда: nc
Неизвестная команда "NC". Для вызова справки нажмите F1.

Команда: (nc)
; ошибка: no function definition: NC
Yuzer вне форума  
 
Непрочитано 09.06.2010, 21:33
#26
Nike

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


Цитата:
Сообщение от Yuzer Посмотреть сообщение
Команда: nc
Неизвестная команда "NC". Для вызова справки нажмите F1.
может все-таки "new-copy"? Где ты там нашел "NC"
Nike вне форума  
 
Автор темы   Непрочитано 09.06.2010, 21:54
#27
Yuzer

Мозговой штурм
 
Регистрация: 26.10.2008
Рідна ненька - Україна, Харків
Сообщений: 5,705


Nike, начало лиспа:

Цитата:
defun c:nc ( / ss start next adoc _cmdecho oBjLst)
тем более по ссылке VVA есть маленький видеоролик

p.s. new-copy я тоже пробовал.
Yuzer вне форума  
 
Непрочитано 09.06.2010, 22:05
#28
Nike

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


аа, код со второй страницы..
У меня работает
Nike вне форума  
 
Непрочитано 09.06.2010, 22:15
#29
VVA

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


Цитата:
Сообщение от Yuzer Посмотреть сообщение
Если честно, то не понял в чем отличие версии Алексея (проверял на скорую руку).
Ни в чем. Та тема называется "Ошибки Express Tools". В #27 посте была описана проблема. Будем надеяться, что Алексей ее исправил.

Цитата:
Сообщение от Yuzer Посмотреть сообщение
Alternative copy подгрузил, но запустить не получилось
Там 2 NC. Ты грузил этот? Может плохо скопировал? Иногда не захватывается скобка в начале или конце кода
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 09.06.2010, 22:28
#30
Yuzer

Мозговой штурм
 
Регистрация: 26.10.2008
Рідна ненька - Україна, Харків
Сообщений: 5,705


Часть не копирнулась.
Спасибо за разъяснения.
Yuzer вне форума  
 
Непрочитано 09.06.2010, 23:56
#31
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Yuzer Посмотреть сообщение
Что делаю не так?
Все так...
в программе отсутствует функция (vl-load-com)
Ой, Можно ли сделать, чтоб сразу к новому можно было переходить... Или сообщения удалять? Хотя б последнее

Последний раз редактировалось gomer, 10.06.2010 в 00:03.
gomer вне форума  
 
Непрочитано 10.06.2010, 01:19
#32
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Цитата:
Сообщение от gomer Посмотреть сообщение
сразу к новому можно было переходить...
См.аттач.

Цитата:
Сообщение от gomer Посмотреть сообщение
Или сообщения удалять? Хотя б последнее
Я случайно создал тему не в том разделе или случайно продублировал тему / пост. Что делать?
Миниатюры
Нажмите на изображение для увеличения
Название: 001.jpg
Просмотров: 82
Размер:	39.0 Кб
ID:	40587  
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.10.2011, 19:25
#33
Garand


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


Здравствуйте!
Имеется несколько иная задача: нужно расставить объекты через задаваемый интервал на определенном отрезке, но так, чтобы этот массив объектов разместился равноудаленно от его концов. (т.е., симметрично центру). Кто-нибудь сможет предложить решение? (а если еще такое же распределение по площади - вообще будет супер).
Garand вне форума  
 
Непрочитано 01.10.2013, 14:31
#34
Любознательный

Проектирование систем автоматизации, связи, сигнализации, организация электронного документооборота
 
Регистрация: 03.03.2005
Харьков
Сообщений: 20


Большая просьба доработать код программы kpblc'а (разрешение автора имеется) test, приведенной на http://forum.dwg.ru/showpost.php?p=580435&postcount=13, добавив проверку и выполнение следующего:
1 если дистанция между точками меньше или равна 10400, то количество сегментов 2,
если больше 10400, но меньше или равна 20800, то количество сегментов 4,
если больше 20800, но меньше или равна 31200, то количество сегментов 6 и т.д.
2 удалить все четные точки.

Если интересует для чего это - для прикидки расположения дымовых датчиков пожарной сигнализации на плане помещения, нормируемое максимальное расстояние от датчика до стены 5,3 м, между датчиками 10,5 м.

Буду премного благодарен.
Любознательный вне форума  
 
Непрочитано 01.10.2013, 14:44
1 | #35
Nike

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


Любознательный, мож тебе готовую программу подкинуть? http://dwg.ru/dnl/522
Nike вне форума  
 
Непрочитано 01.10.2013, 15:12
#36
Любознательный

Проектирование систем автоматизации, связи, сигнализации, организация электронного документооборота
 
Регистрация: 03.03.2005
Харьков
Сообщений: 20


Спасибо, изучаю.
Любознательный вне форума  
 
Непрочитано 01.10.2013, 15:15
#37
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Nike, а еще какие-нибудь у тебя сырые проги есть?
Profan вне форума  
 
Непрочитано 01.10.2013, 15:21
#38
Nike

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


Profan, есть одна.
"nanoCAD" называется.
Nike вне форума  
 
Непрочитано 01.10.2013, 15:23
#39
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Тьфу, блин.
Profan вне форума  
 
Непрочитано 01.10.2013, 15:48
#40
Nike

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


Profan, навалом всякого барахла. Всё отсюда да с кадюзера. А что интересует?
Nike вне форума  
 
Непрочитано 01.10.2013, 15:55
#41
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Да по слаботочке.
Profan вне форума  
 
Непрочитано 01.10.2013, 16:01
#42
Nike

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


Вот такая шняга есть - http://dwg.ru/dnl/11426
Несколько простых функций линии рисовать да блоки нумеровать. Больше ничего.
Nike вне форума  
 
Непрочитано 01.10.2013, 18:15
#43
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Это я, кажись, стибрил уже.
Profan вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp. Копирование объектов между точками



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Копирование, сортировка, переименование листов (layout) VVA Готовые программы 115 28.03.2025 20:59
Lisp: Обработка объектов и получение списка свойств (координаты точек) Nanotronic LISP 2 23.04.2009 23:07
LISP. Распределение по слоям объектов dim.,hatch,text Суханова LISP 5 28.08.2008 13:31
Как определить расстояние между 2 точками по spline? Хотабыч Программирование 5 22.01.2006 15:33
загрузка DOS прог через LISP Gaa LISP 15 12.08.2005 19:19