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

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

LISP. Как программно создавать масштабы аннотаций?

Ответ
Поиск в этой теме
Непрочитано 03.10.2011, 16:05 #1
LISP. Как программно создавать масштабы аннотаций?
Кулик Алексей aka kpblc
Moderator
 
LISP, C# (ACAD 200[9,12,13,14])
 
С.-Петербург
Регистрация: 25.08.2003
Сообщений: 36,760

Доброго всем. Есть код, показанный VVA в теме "Мои макрокоманды", но почему-то масштабы не создаются (точнее, не создаются словарные записи). На данный момент пользуюсь такой модификацией:
Код:
[Выделить все]
 (defun _kpblc-acad-scalelist-clear-and-restore (lst / scalelist item pos dict lasthandle n dn)
                                               ;|
*    Очищает список масштабов и восстанавливает стандартный
*    Параметры вызова
	lst		список масштабов. nil -> просто очистка, без создания новых
				формат списка:
				'(("Имя масштаба" МасштабЕдиницыЛиста МасштабЕдиницыЧертежа)
				  <...>
				  )
*    Примеры вызова:
(_kpblc-acad-scalelist-clear-and-restore '(("1:1" 1. 1.) ("1:200" 1. 200.) ("1:500" 1. 500.) ("1:2 000" 1. 2000.)))
|;
  (foreach scale (mapcar (function cdr)
                         (vl-remove-if-not (function (lambda (x) (= (car x) 350)))
                                           (dictsearch (namedobjdict) "acad_scalelist")
                                           ) ;_ end of vl-remove-if-not
                         ) ;_ end of mapcar
    (if (not (member (cdr (assoc 300 (entget scale))) (mapcar (function car) lst)))
      (vl-catch-all-apply
        (function
          (lambda ()
            (vla-delete (vlax-ename->vla-object scale))
            ) ;_ end of lambda
          ) ;_ end of function
        ) ;_ end of vl-catch-all-apply
      ) ;_ end of if
    ) ;_ end of foreach

  (setq scalelist (mapcar (function cdr)
                          (vl-remove-if-not (function (lambda (x) (= (car x) 350)))
                                            (setq dict (dictsearch (namedobjdict) "acad_scalelist"))
                                            ) ;_ end of vl-remove-if-not
                          ) ;_ end of mapcar
        n         (atoi
                    (chr
                      (1+
                        (apply 'max
                               (apply 'append
                                      (mapcar '(lambda (x) (vl-remove-if '(lambda (a) (> a 57)) (vl-string->list (cdr x))))
                                              (vl-remove-if-not '(lambda (x) (= (car x) 3)) dict)
                                              ) ;_ end of mapcar
                                      ) ;_ end of apply
                               ) ;_ end of apply
                        ) ;_ end of 1+
                      ) ;_ end of chr
                    ) ;_ end of atoi
        dn        (chr
                    (+
                      (if (= n 9)
                        (progn (setq n 0) 1)
                        0
                        ) ;_ end of if
                      (apply 'max
                             (apply 'append
                                    (mapcar '(lambda (x) (vl-remove-if '(lambda (a) (< a 65)) (vl-string->list (cdr x))))
                                            (vl-remove-if-not '(lambda (x) (= (car x) 3)) dict)
                                            ) ;_ end of mapcar
                                    ) ;_ end of apply
                             ) ;_ end of apply
                      ) ;_ end of 1+
                    ) ;_ end of chr
        ) ;_ end of setq

  ;; Теперь добавление отсутствующих масштабов
  (if (setq dict (dictsearch (namedobjdict) "acad_scalelist"))
    (foreach item lst
      (_kpblc-error-catch
        (function
          (lambda (/ tmp)
            (dictadd (cdr (assoc -1 dict))
                     (setq tmp (strcat
                                 (if (= n 9)
                                   (setq n  -1
                                         dn (chr (1+ (ascii dn)))
                                         ) ;_ end of setq
                                   dn
                                   ) ;_ end of if
                                 (itoa (setq n (1+ n)))
                                 ) ;_ end of strcat
                           ) ;_ end of setq
;;; Ошибка именно здесь: entmake возвращает nil в AutoCAD 2009x64, AUtoCAD 2012x64
                     (entmakex (list '(0 . "SCALE")
                                     '(100 . "AcDbScale")
                                     (cons 300 (car item))
                                     (cons 140 (cadr item))
                                     (cons 141 (caddr item))
                                     ) ;_ end of list
                               ) ;_ end of entmakex
                     ) ;_ end of dictadd
            ) ;_ end of lambda
          ) ;_ end of function
        '(lambda (x)
           (_kpblc-error-print (strcat "Не удалось добавить масштаб " (car item)) x)
           ) ;_ end of lambda
        ) ;_ end of _kpblc-error-catch
      ) ;_ end of foreach
    ) ;_ end of if
  ) ;_ end of defun
Cобственно вопрос: как обойти? B в чем ошибка?
Спасибо.
---
Добавил библиотечные функции.

Вложения
Тип файла: lsp _kpblc-error-catch.LSP (873 байт, 102 просмотров)
Тип файла: lsp _kpblc-error-print.LSP (1,023 байт, 84 просмотров)
Тип файла: lsp _kpblc-conv-value-to-string.LSP (361 байт, 84 просмотров)
Тип файла: lsp _kpblc-get-msg-norm.LSP (199 байт, 77 просмотров)

__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 03.10.2011 в 20:06.
Просмотров: 4361
 
Непрочитано 03.10.2011, 16:55
#2
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
;;; Ошибка именно здесь: entmake возвращает nil в AutoCAD 2009x64, AUtoCAD 2012x64
(entmakex (list '(0 . "SCALE")
'(100 . "AcDbScale")
(cons 300 (car item))
(cons 140 (cadr item))
(cons 141 (caddr item))
) ;_ end of list
) ;_ end of entmakex
Кулик Алексей aka kpblc, так у Тебя entmakex возвращает nil или entmake, а с entmakex все норамально работает? Просто у меня с entmakex все пашет, а entmake вроде как и непредназначен для создания словарей, ведь он (entmake) даже если и вернет не nil, то это будет список, а его в словарь не подсунешь?
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 03.10.2011, 16:57
#3
Кулик Алексей aka kpblc
Moderator

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


У меня именно entmakex возвращает nil, в том-то и проблема. Пока что обнаружил на 64-разрядных 2009 и 2012, возможно, на 32-разрядных работать будет нормально (проверить сейчас не могу ).
Я в комментарии очепятался, а не в коде
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.10.2011, 19:07
#4
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,801
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Проверил на Автокад 2009 x86 - функция работает.
Пока что нужно поискать машины с x64 чтобы проверить остальное
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 04.10.2011, 09:01
#5
Кулик Алексей aka kpblc
Moderator

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


Ура! Нашел!
В entmakex надо добавить точечные пары '(70 . 0) и '(290 . 1). Правда, за что они отвечают - пока неясно...
P.S. Если есть возможность - потестите на 32-разрядных системах. У меня пока такой возможности нет
P.P.S. Проверил - работает на AutoCAD 2012 x32.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 04.10.2011 в 09:22.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 04.10.2011, 09:27
#6
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Ура! Нашел!
В entmakex надо добавить точечные пары '(70 . 0) и '(290 . 1). Правда, за что они отвечают - пока неясно...
P.S. Если есть возможность - потестите на 32-разрядных системах. У меня пока такой возможности нет
(entmakex (list '(0 . "SCALE") '(100 . "AcDbScale") (cons 300 (car item)) (cons 140 (cadr item)) (cons 141 (caddr item)) '(70 . 0) '(290 . 1)))
AutoCAD 2008 x86 всё работает.
P. S. Есть замечание, при входном списке масштабов '(("1:1" 1. 1.) ("1:200" 1. 200.) ("1:500" 1. 500.) ("1:2 000" 1. 2000.)), вначале кода при удалении старых мастшатов, масштаб 1:1 остается, а потом еще добавляется новый с тем же именем, в итоге у меня получается два масштаба 1:1, в книгах говорят что так нехорошо делать.
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 04.10.2011, 10:41
#7
Кулик Алексей aka kpblc
Moderator

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


Да, это не гуд. Вот вроде бы окончательный код. У меня пока что "дубликаты" не создавал.
Вложения
Тип файла: lsp scalelist.lsp (11.4 Кб, 150 просмотров)
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.12.2011, 08:59
#8
Fedorino

автоматизация и организация черчения
 
Регистрация: 17.11.2009
Sterlitamak
Сообщений: 128


Здравствуйте! Спасибо за интересный лисп. Подскажите как добавить масштабы 1:2,5 и 2,5:1? Завязал лисп на кнопку добавив свои необходимые масштабы, но данные масштабы так и не сумел прописать. Каким способом можно обозначить запятую в десятичном числе. Например вставляю код:
(_kpblc-acad-scalelist-clear-and-restore '(("1:1" 1. 1.) ("1:2,5" 1. 2,5.))) - не работает,
(_kpblc-acad-scalelist-clear-and-restore '(("1:1" 1. 1.) ("1:2,5" 1. 2.5.))) - не работает,
(_kpblc-acad-scalelist-clear-and-restore '(("1:1" 1. 1.) ("1:2,5" 1. (2.5).))) - не работает.
Жду ответа.
__________________
слесарь САПР

Последний раз редактировалось Fedorino, 21.12.2011 в 11:52.
Fedorino вне форума  
 
Непрочитано 21.12.2011, 12:00
#9
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,801
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от Fedorino Посмотреть сообщение
(_kpblc-acad-scalelist-clear-and-restore '(("1:1" 1. 1.) ("1:2,5" 1. 2.5.))) - не работает,
Что ты имел ввиду, ставя красную точку?
Код:
[Выделить все]
(_kpblc-acad-scalelist-clear-and-restore '(("1:1" 1. 1.)("1:2,5" 1. 2.5) ("2,5:1" 2.5 1.)))
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 21.12.2011, 12:13
#10
Fedorino

автоматизация и организация черчения
 
Регистрация: 17.11.2009
Sterlitamak
Сообщений: 128


Спасибо, то что надо. Я не разбираюсь в лиспе, поэтому думал что точкой заканчивается ввод данных в поля единицы чертежа и единицы листа.
P.S.: создал файл чертежа на основе шаблона acadiso.dwt, со стандартным списком масштабов. Ввожу в командную строку код:
(_kpblc-acad-scalelist-clear-and-restore '(("1:1" 1. 1.) ("1:2" 1. 2.) ("1:2,5" 1. 2.5) ("1:4" 1. 4.) ("1:5" 1. 5.) ("1:10" 1. 10.) ("1:15" 1. 15.) ("1:20" 1. 20.) ("1:25" 1. 25.) ("1:40" 1. 40.) ("1:50" 1. 50.) ("1:75" 1. 75.) ("1:100" 1. 100.) ("2:1" 2. 1.) ("2,5:1" 2.5 1.) ("4:1" 4. 1.) ("5:1" 5. 1.) ("10:1" 10. 1.) ("20:1" 20. 1.) ("40:1" 40. 1.) ("50:1" 50. 1.) ("100:1" 100. 1.)))
Все прекрасно, но вот только масштабов 1:2,5 и 2,5:1 нету в новом списке, все остальные присутствуют. Прошу форумчан опробовать код на данном файле и сообщить о результате.
Вложения
Тип файла: dwg
DWG 2010
acadiso.dwg (66.8 Кб, 1731 просмотров)
__________________
слесарь САПР

Последний раз редактировалось Fedorino, 21.12.2011 в 15:41.
Fedorino вне форума  
 
Непрочитано 21.12.2011, 16:29
#11
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Имелось в виду:
1:2.5 и 2.5:1 - не?
Олег (jr.) вне форума  
 
Непрочитано 21.12.2011, 22:50
#12
Fedorino

автоматизация и организация черчения
 
Регистрация: 17.11.2009
Sterlitamak
Сообщений: 128


Да, не создаются масштабы "1:2,5" и "2,5:1" или 1:2.5 и 2.5:1.
Выяснил закономерность. При создании чертежа на основе файла шаблона acadiso.dwt, имеется некоторый список масштабов по умолчанию.
При вводе макроса: (_kpblc-acad-scalelist-clear-and-restore '(("1:1" 1. 1.) ("1:2" 1. 2.) ("1:2,5" 1. 2.5) ("1:4" 1. 4.) ("1:5" 1. 5.) ("1:10" 1. 10.) ("1:15" 1. 15.) ("1:20" 1. 20.) ("1:25" 1. 25.) ("1:40" 1. 40.) ("1:50" 1. 50.) ("1:75" 1. 75.) ("1:100" 1. 100.) ("2:1" 2. 1.) ("2,5:1" 2.5 1.) ("4:1" 4. 1.) ("5:1" 5. 1.) ("10:1" 10. 1.) ("20:1" 20. 1.) ("40:1" 40. 1.) ("50:1" 50. 1.) ("100:1" 100. 1.)))
Создаются все масштабы, кроме "1:2,5" и "2,5:1".
Но, если же вручную удалить сначало все масштабы образованные по-умолчанию, оставив 1:1,
а затем ввести тот же макрос, то в списке масштабов появляются и злополучные "1:2,5" и "2,5:1".
Как решить данную проблему, может кто подскажет?
__________________
слесарь САПР

Последний раз редактировалось Fedorino, 22.12.2011 в 07:04.
Fedorino вне форума  
 
Непрочитано 23.04.2013, 12:59
#13
perpetule


 
Регистрация: 23.09.2008
Волгоград
Сообщений: 810
<phrase 1= Отправить сообщение для perpetule с помощью Skype™


Просто очистка такой строкой приводит к фатальной ошибке
(_kpblc-acad-scalelist-clear-and-restore ())
perpetule вне форума  
 
Автор темы   Непрочитано 23.04.2013, 14:22
#14
Кулик Алексей aka kpblc
Moderator

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


perpetule, найди одно отличие:
Код:
[Выделить все]
(_kpblc-acad-scalelist-clear-and-restore '())
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.04.2013, 14:27
#15
perpetule


 
Регистрация: 23.09.2008
Волгоград
Сообщений: 810
<phrase 1= Отправить сообщение для perpetule с помощью Skype™


Спасибо, темные мы ....


Не .....

Такаой же фатал ерорр. при попытке посмотреть список масштабов в левом нижнем углу, отсутствие хотя бы одного вызывает ступор у автокада

Последний раз редактировалось perpetule, 23.04.2013 в 16:07.
perpetule вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Как программно создавать масштабы аннотаций?

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как программно (на lisp) определить высоту текущего шрифта? detrah LISP 7 18.08.2011 10:05
LISP / AutoCAD2008 / Как программно снять выделение у примитивов, не используя sssetfirst TararykovDG LISP 7 14.01.2011 10:48
{Конкурс} Lisp. Задачки для студентов gomer LISP 10 05.01.2011 16:33
Как создать слой (программно - Lisp) NEDIS LISP 4 29.08.2010 20:36
Как программно на лиспе создавать трехмерные детали? solo123 LISP 6 11.03.2010 12:10