Почем mapcar и command не дружат в AutoCad2015?
Реклама i
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Почем mapcar и command не дружат в AutoCad2015?

Почем mapcar и command не дружат в AutoCad2015?

Ответ
Поиск в этой теме
Непрочитано 09.04.2015, 09:44 #1
Почем mapcar и command не дружат в AutoCad2015?
LongerSnake
 
Регистрация: 09.04.2015
Сообщений: 5

Появилась необходимость перехода с 2002-го на 2015-й.
Код который отлично работал в 2002-2009 не работает в 15-ом
Нужно было нарисовать линию по списку точек
Код:
[Выделить все]
  
;spPoi - список  точек
;spName-набор
;p4 - конечная точка
(COMMAND)
(COMMAND "_LINE" (CAR spPoi))
  (MAPCAR '(LAMBDA (x)
             (COMMAND x)
             (SETQ spName (SSADD (ENTLAST) spName))
           ) 
          (CDR spPoi)
  ) ;_ конец MAPCAR
(COMMAND p4 "")
Такой код выдаёт ошибку VVC: internal error - WC:Internal error Autocad 2015

Пошерстил инет, нашёл пару ссылок по этому поводу
http://www.cadtutor.net/forum/showth...r-Autocad-2015

Замена COMMAND на COMMAND-S результата естесвенно не даст, потому что http://docs.autodesk.com/ACDMAC/2014...ber=d30e351208
Раздел Known Considerations

Попробывал решить вот так:
Код:
[Выделить все]
 
(setq pt1 (car spPoi))
  (MAPCAR '(LAMBDA (x)
             (entmake (list '(0 . "LINE") (cons 10 pt1)(cons 11 x)))
             (setq pt1 x)
             (SETQ spName (SSADD (ENTLAST) spName))
           )
          (CDR spPoi)
  )
(entmake (list '(0 . "LINE") (cons 10 pt1)(cons 11 p4)))
Вроде всё работает как нужно, но у меня подбная конструкция с mapcar используется примерно в 200 местах разбросанных по 40 файлам. Очень много переделок

Может кто подскажет изящное решение данной проблемы, чтоб не лазить по всем файлам?
Просмотров: 4465
 
Непрочитано 09.04.2015, 09:59
#2
Кулик Алексей aka kpblc
Moderator

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


https://www.google.com/url?q=http://...acLF1EEAiIOgww - как пример.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.04.2015, 11:00
#3
LongerSnake


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


ну дык там как раз хороший вопрос

В описалове по command-s:
Цитата:
When using the command-s function, you must take the following into consideration:

Token streams fed in a single command-s expression must represent a full command and its input. Any commands in progress when command tokens are all processed will be cancelled. The following is not valid with the command-s function:

(command-s "_line")
(command-s "2,2" "12.25,9" "")

All command tokens will be evaluated before they are handed over to AutoCAD for execution. In contrast, the command function actually performs each command token evaluation and then feeds the result to AutoCAD, which processes it before the next command token is processed.
No "Pause" command tokens may be used. Expressions that interact with the drawing area or Command Window may be used, but will all be processed before AutoCAD receives and processes any of them.

The following is not valid with the command-s function:

(command-s "_line" "0,0" PAUSE "")

Important Although the command-s function is similar to the command function, caution should be taken when using U or UNDO to roll back the system state if there is an AutoCAD command already in progress when the AutoLISP expression is entered. In that case, the results of running UNDO may cause the command in progress to fail or even crash AutoCAD.
тоесть:
Код:
[Выделить все]
 (setq pt1 '(1 1) pt2 '(1 5))
(command "._line" pt1 pt2 "")
(command-s "._line" pt1 pt2 "")
(command "._line")(command pt1)(command pt2 "")
Отлично работает
авот так мало того что не работает, но и подвешивает автокад
(command-s "._line")(command-s pt1)(command-s pt2 "")
LongerSnake вне форума  
 
Непрочитано 09.04.2015, 12:25
#4
VVA

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


LongerSnake, Ну так вроде как написано
Цитата:
Token streams fed in a single command-s expression must represent a full command and its input.
Я это понимаю так, должны присутствовать все данные (точки, опции и т.п.) в единственном вызове command-s
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 09.04.2015, 13:06
#5
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от VVA Посмотреть сообщение
Я это понимаю так, должны присутствовать все данные (точки, опции и т.п.) в единственном вызове command-s
Именно так! Один вызов (command-s) должен выполнить всю команду от начала и до конца.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 09.04.2015, 13:18
#6
LongerSnake


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


VVA, дык это всё понятно, когда у тебя точки оттельными переменными. А как быть со списком?
LongerSnake вне форума  
 
Непрочитано 09.04.2015, 13:21
#7
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от LongerSnake Посмотреть сообщение
А как быть со списком?
С (command-s) никак.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 09.04.2015, 14:23
#8
LongerSnake


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


тоесть в данной ситуации entmake наилучший вариант? mapcar переделывать в foreach более трудоёмко.
LongerSnake вне форума  
 
Непрочитано 09.04.2015, 14:40
#9
VVA

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


Цитата:
Сообщение от LongerSnake Посмотреть сообщение
дык это всё понятно, когда у тебя точки оттельными переменными. А как быть со списком?
Как-то так
Код:
[Выделить все]
 
(setq lst (list '(0 0) '(10 10) '(20 5) '(23 18)))
(apply 'command-s (cons "_.pline" (reverse (cons "_С" (reverse lst)))))
или так для наглядности
Код:
[Выделить все]
 
(setq lst (list '(0 0) '(10 10) "_A" "_W" 1 1 '(20 5) "_W" 0 0 "_L" '(23 18) "_C"))
(apply 'command-s (cons "_.pline" lst))
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 09.04.2015 в 14:49.
VVA вне форума  
 
Автор темы   Непрочитано 10.04.2015, 08:06
#10
LongerSnake


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


VVA, неплохое решение! Спасибо
LongerSnake вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Почем mapcar и command не дружат в AutoCad2015?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Замена динамических блоков Serge_Y Программирование 82 04.04.2019 11:54
Определение количества используемой памяти. solo123 Программирование 8 22.03.2010 14:32
Как автоматизировать печать чертежа? Serge_BN Программирование 13 04.03.2010 14:34
Отыскание условного экстремума с помощью множителей Лаграньжа slogos Программирование 19 11.02.2010 12:59
(GRREAD) и привязка Ева Программирование 17 18.12.2009 09:10