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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Непонятное поведение команды COPY

LISP. Непонятное поведение команды COPY

Ответ
Поиск в этой теме
Непрочитано 29.10.2013, 20:28 #1
LISP. Непонятное поведение команды COPY
Скандербег
 
Регистрация: 26.10.2013
Сообщений: 10

Может кто встречался с таким артефактом и может пояснить где чего искать.
В скрипте лиспа, помимо всего прочего, есть команда копирования:
Код:
[Выделить все]
   (command "_.copy" pp (polar pp2 (dr 270) (* 0.1 d)) "" pp1 "М" n pp3 "") ; 1-вариант
;  (command "_.copy" "С" (polar pp (dr 80) (* 0.2 d)) (polar pp pi (* 0.2 d))  pp1 "М" n pp3 "") ;2 - вариант
Приведенные варианты отличаются разным способом выделения полилиний, которые затем копируются n-е количество раз (d - масштабный коэффициент).
Когда команда рисования применяется к новому чертежу (создается новый пустой файл чертежа), то ни первый, ни
второй варианты не срабатывают - не выделяют полилинии и вместо ожидаемого массива на чертеже пустота.
Стоит применить команду повторно на этом же чертеже (предварительно все нарисованное удаляется), то команда copy
работает нормально. Но только по первому варианту (объекты выделяются по точкам на линиях).
Во втором варианте линии не выделяются рамкой ни при каких обстоятельствах.
Просмотров: 2797
 
Непрочитано 29.10.2013, 20:34
#2
Profan


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


Цитата:
Сообщение от Скандербег Посмотреть сообщение
В скрипте лиспа, помимо всего прочего, есть команда копирования:
Код:
А в "скрипте лиспа" помимо всего прочего есть команда отрисовки полилиний, если уж речь идет о новом пустом чертеже?
Profan вне форума  
 
Автор темы   Непрочитано 29.10.2013, 20:37
#3
Скандербег


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


Да, конечно, есть. Потому как при повторном выполнении команды (функции) копии линий появляются в нужном количестве.
Скандербег вне форума  
 
Непрочитано 29.10.2013, 20:55
#4
Profan


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


А как может команда _COPY работать нормально, если "предварительно все нарисованное удаляется"?
Весь "скрипт" нельзя выложить?
Profan вне форума  
 
Автор темы   Непрочитано 29.10.2013, 21:03
#5
Скандербег


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


Скрипт длинный. А удаляется все в модели командой (command "_erase" "_all" ""), а далее происходит рисование по новой всего
чертежа, где разумеется есть все нужные линии. Фрагмент, предваряющий копирование:
Код:
[Выделить все]
   (setq pp1 p23)
  (setq pp (polar pp1 (dr 270) (* 0.5 d)))
    (setq d1 (polar pp1 pi (* 0.15 d)))
  (setq pp2 (polar d1 (dr 90) (* 0.15 d)))
  (setq pp3 (polar pp1 pi (* 0.3 d)))
  (command "_.pline" pp pp1 pp2 pp3 "")
  (command "_.pline" pp2 (polar pp2 (dr 270) (* 0.65 d)) "")
  (command "_.copy" pp (polar pp2 (dr 270) (* 0.1 d)) "" pp1 "М" n pp3 "") 
----- добавлено через ~11 ч. -----
Привожу тестовый скрипт, при выполнении которого копирование ведет себя непонятно.
Код:
[Выделить все]
 (defun dr (a) (* pi (/ a 180.0)))

(defun C:ktst ()
  (command "_erase" "_all" "")
  (setq p (getpoint "\nВведите координаты точки: "))
  (setq
    p1 (polar p (dr 90) 10)
    p2 (polar p1 (dr 135) 3)  
    p3 (polar p2 (dr 225) 3)  
  )
  (command "_.pline" p p1 p2 p3 "")
  (command "_.copy" p "" p1 "М" 5 p3 "")

  (command "_zoom" "_e")
)
Условия: Autocad 2013 (руссифицированный).
В автокаде создается пустой файл чертежа. Загружается скрипт (файл назван ktst.lsp).
Выполняется команда "ktst". Вместо 5-ти копий вижу одну нарисованную полилинию.
Команда выполняется повторно ничего не меняя в скрипте: появляются все 5 копий.
В этом для меня и загадка.
Скандербег вне форума  
 
Непрочитано 30.10.2013, 09:08
#6
Кулик Алексей aka kpblc
Moderator

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


1. Привязки.
2. Локализация переменных.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 30.10.2013, 09:37
#7
Скандербег


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


Уже было сделано.
Привязки отключены (setvar "OSMODE" 0).
Переменные локализованы (defun C:ktst (/ p p1 p2 p3)...
Увы. История точно такая же - на новом чертеже копий нет.
Может опытных разработчиков такой факт натолкнет на мысль:
Код:
[Выделить все]
 (defun C:ktst (/ p p1 p2 p3)
  (command "_erase" "_all" "")
  (setvar "OSMODE" 0)
  (setq p (getpoint "\nВведите координаты точки: "))
  (command "_zoom" "_e") ;<---
  (command "_.line" p (polar p (dr 90) 1) "");<---
  (command "_zoom" "_e");<---
  (setq
    p1 (polar p (dr 90) 10)
    p2 (polar p1 (dr 135) 3)  
    p3 (polar p2 (dr 225) 3)  
  )
  (command "_.pline" p p1 p2 p3 "")
  (command "_.copy" p "" p1 "М" 5 p3 "")
  (command "_zoom" "_e")
)
Три дополнительных команды (отммечены <---) каким-то образом влияют на копирование и все копии появляются на новом чертеже.
Но, понятно, что это не дело.
Скандербег вне форума  
 
Непрочитано 30.10.2013, 09:50
#8
Profan


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


Я думаю, что здесь не "непонятное поведение соманды "_COPY", а некорректный способ выбора объектов.
Profan вне форума  
 
Автор темы   Непрочитано 30.10.2013, 10:03
#9
Скандербег


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


Не возражаю. Надо было как-то назвать тему. Тоже заметил, что именно в выборе проблема.
С другой стороны, почему выбор объекта по точке на нем - некорректен?
И как тогда корректно выбрать объекты?
Скандербег вне форума  
 
Непрочитано 30.10.2013, 15:49
#10
VVA

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


Скандербег, Поясни, что за опция "М" в команде копирования?
Код:
[Выделить все]
(command "_.copy" p "" p1 "М" 5 p3 "")
Цитата:
Сообщение от Скандербег Посмотреть сообщение
И как тогда корректно выбрать объекты?
Запоминать.
Код:
[Выделить все]
(defun dr (a) (* pi (/ a 180.0)))
(defun C:ktst (/ p p1 p2 p3 ss i len)
  (command "_erase" "_all" "")
  ;;; (setvar "OSMODE" 0)
  (if (setq p (getpoint "\nВведите координаты точки <вход>: "))
    (progn
      (setq ss (ssadd)) ;_Создаем пустой набор
      (command "_zoom" "_e") ;<---
      (command "_.line" "_non" p "_non" (polar p (dr 90) 1) "");<---
      (ssadd  (entlast) ss) ;_добавляем линию к набору
      (command "_zoom" "_e");<---
      (setq
        p1 (polar p (dr 90) 10)
        p2 (polar p1 (dr 135) 3)
        p3 (polar p2 (dr 225) 3)
        len (distance p1 p3)
        i 0
        )
      (command "_.pline" "_non" p "_non" p1 "_non" p2 "_non" p3 "")
      (ssadd  (entlast) ss) ;_добавляем полилинию к набору
      (repeat 5
        (command "_.copy" ss "" "_non" p1 "_non" (polar p1 0 (* (setq i (1+ i)) len)))
        (while (> (getvar "CMDACTIVE") 0) (command ""))
        )
      (command "_zoom" "_e")
      )
    )
)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 30.10.2013, 16:28
#11
Скандербег


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


Цитата:
что за опция "М" в команде копирования?
В русскоязычном Автокаде это "Массив" (в старых англоязычных версиях, насколько помню, был "Array"). Именно эта опция и позволяет обходится без цикла.
Почему в моем автокаде проходит смесь латинских и русских опций и названий команд я, конечно, не знаю, но работает.

Спасибо за подсказку. Попробую. "Запоминать" в голову приходило, но как это делать не нашел.

----- добавлено через ~29 мин. -----
VVA, "запоминание" срабатывает отлично. Спасибо большое.

Не подскажете решение похожей проблемы выбора объектов в команде TRIM.
Нужно обрезать линии, которые я тоже в лиспе выбираю точками на них.
Отсюда та же проблема - на новом чертеже объекты не выбираются и линии не обрезаются (на уже "запачканном" чертеже обрезка идет нормально).
Но в этой ситуации, как я понимаю, запоминание объектов не поможет, т.к. нужно выбирать именно точку в том месте линии, которая идет под обрезку.
Здесь может помочь выбор объекта рамкой, но с опциями рамки для выбора объектов не разобрался - объекты не выбираются.
Какие на самом деле опции нужны для выбора с рамкой?
Скандербег вне форума  
 
Непрочитано 30.10.2013, 19:24
1 | #12
VVA

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


Цитата:
Сообщение от Скандербег Посмотреть сообщение
В русскоязычном Автокаде это "Массив"
Моя рабочая лошадка пока 2009. Похоже массив появился позднее

Цитата:
Сообщение от Скандербег Посмотреть сообщение
Не подскажете решение похожей проблемы выбора объектов в команде TRIM.
...
Но в этой ситуации, как я понимаю, запоминание объектов не поможет т.к. нужно выбирать именно точку в том месте линии, которая идет под обрезку.
Поможет, но запоминать нужно другим способом: имя примитива и точка. Команде trim нужно передавать список в таком же виде, какой возвращает функция (entsel)
Информация для анализа
trim и offset из сценария scr пост #4 п.5
Программный TRIM пост #8 последняя строчка
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 30.10.2013 в 19:29.
VVA вне форума  
 
Автор темы   Непрочитано 30.10.2013, 20:55
#13
Скандербег


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


Спасибо большое. Замечательный материал. Получилось справиться со всеми вылезающими болячками.
Скандербег вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Непонятное поведение команды COPY



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AutoCAD 2012ru поведение курсора (Snap On/вкл. шаг) - движение курсора "скачками" без выполнения команды Alexey_02 AutoCAD 18 09.07.2015 18:19
Непонятное поведение цикла по списку swkx Программирование 33 28.03.2012 15:39
Вызов команды внешнего приложения из lisp больше 4 раз Andrej2 LISP 5 22.09.2009 15:35
Запуск Lisp команды в новом документе BlackHarp LISP 1 26.03.2009 23:06
Использование команды mtext в lisp gool LISP 2 17.09.2008 12:57