Создание мультивыносок

Автор Тема: Создание мультивыносок  (Прочитано 14931 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн АлексейТАвтор темы

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
Создание мультивыносок
« : 28-04-2015, 13:38:32 »
Прошу помогите кто ни будь!
Я пытаюсь создать лисп превращающий выбранный текст или мультитекст в
мультивыноску, но видать из за скудности моих познаний в данной тематике
не удаётся преодолеть ошибочку (пишет ошибка неверный список)!
Код - Auto/Visual Lisp [Выбрать]
  1. Привожу текст искомого лиспа:
  2. (defun c:vin (/ vin lst t1 t2 t3 t4)
  3.   (setq t1 (ssget "_:S"))
  4.   (setq t2 (ssname t1 0))
  5.   (setq t3 (entget t2))
  6. (setq t4 (nth 1 (assoc 1 t3)))
  7.   (setq vin (getpoint))
  8.   (VL-cmdf "_mleader" vin t4 "")
  9. )

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Создание мультивыносок
« Ответ #1 : 28-04-2015, 13:52:30 »
Приветствую на форуме!
1. Создание одинаковых сообщений в разных ветках форума запрещено (п. 4.2. Правил).
2. Эта строка точно неверна. Проверь её:
Код - Auto/Visual Lisp [Выбрать]
  1. (setq t4 (nth 1 (assoc 1 t3)))
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн АлексейТАвтор темы

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
Re: Создание мультивыносок
« Ответ #2 : 28-04-2015, 14:10:16 »
Александр если я не использую функцию nth то возвращается список (1 . "тект")-это если ещё убрать команду _mleader , а вместе с этой командой возвращается сообщение что "В команду послан неверный тип
nil".
Потому то я логично поразмыслив и решил что функцией nth изыму сам "текст", но увы не так не так не работает.
P.S.^По поводу задвоения тем приношу свои извенения стыдно признаться но я вообще впервые пользуюсь услугами форумов.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Создание мультивыносок
« Ответ #3 : 28-04-2015, 14:16:52 »
Александр если я не использую функцию nth то возвращается список (1 . "тект")-это если ещё убрать команду _mleader , а вместе с этой командой возвращается сообщение что "В команду послан неверный тип
nil".
В этом случае нужно пользоваться функцией (cdr), а не (nth), так как у тебя не обычный список, а точечный.
Вообще же есть большая тема на dwg.ru о создании мультивыносок: http://forum.dwg.ru/showthread.php?t=27965
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн АлексейТАвтор темы

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
Re: Создание мультивыносок
« Ответ #4 : 28-04-2015, 14:28:19 »
Благодарю!
Непременно изучу!

Оффлайн АлексейТАвтор темы

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
Re: Создание мультивыносок
« Ответ #5 : 28-04-2015, 14:58:15 »
Ура!
Всё получилось!
Функция cdr помогла!
Код - Auto/Visual Lisp [Выбрать]
  1. (defun c:vin (/ vin lst t1 t2 t3 t4 t5)
  2.   (setq t1 (ssget "_:S"))
  3.   (setq t2 (ssname t1 0))
  4.   (setq t3 (entget t2))
  5.   (setq t4 (cdr (assoc 1 t3)))
  6.   (setq t5 (strcat t4))
  7.   (setq vin (getpoint))
  8.   (VL-cmdf "_mleader" vin pause t5 "")
  9. )

Оффлайн АлексейТАвтор темы

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
Re: Создание мультивыносок
« Ответ #6 : 28-04-2015, 15:04:24 »
Немного усовершенствовал!
теперь лисп удаляет ранее выбраный текст
Код - Auto/Visual Lisp [Выбрать]
  1. (defun c:vin (/ vin lst t1 t2 t3 t4 t5)
  2.   (setq t1 (ssget "_:S"))
  3.   (setq t2 (ssname t1 0))
  4.   (setq t3 (entget t2))
  5.   (setq t4 (cdr (assoc 1 t3)))
  6.   (setq t5 (strcat t4))
  7.   (setq vin (getpoint))
  8.   (VL-cmdf "_mleader" vin pause t5 "")
  9.   (entdel t2)
  10. )

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Создание мультивыносок
« Ответ #7 : 28-04-2015, 15:05:04 »
В какой версии AutoCAD? Если внимательно прочитать статью Порядок создания мультивыноски (MLEADER) в AutoCAD, то видно что (начиная кажется с AutoCAD 2013) порядок запросов в команде может меняться.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Создание мультивыносок
« Ответ #8 : 28-04-2015, 15:07:26 »
Есть еще один недостаток у этого метода (общий для всех версий AutoCAD). В группе 1 для MTEXT хранится до 255 символов, а остальные хранятся в цепочке групп 3.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн АлексейТАвтор темы

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
Re: Создание мультивыносок
« Ответ #9 : 28-04-2015, 15:16:39 »
AutuCad 2015.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Создание мультивыносок
« Ответ #10 : 28-04-2015, 15:31:31 »
AutoCAD 2015.
Значит в любой момент, если пользователь переключит режим, программа работать не будет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1116
  • Карма: 173
Re: Создание мультивыносок
« Ответ #11 : 28-04-2015, 15:47:58 »
В первом приближении, без контроля результата (это надо уже отдельно делать)
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-load-com)
  2.  
  3. (defun c:vin (/ adoc selset pt ml _kpblc-objectidtoobject idx)
  4.  
  5.   (defun _kpblc-objectidtoobject (obj id)
  6.     (if (and (> (vl-string-search "x64" (getvar "platform")) 0)
  7.              (vlax-method-applicable-p obj 'objectidtoobject32)
  8.              ) ;_ end of and
  9.       (vla-objectidtoobject32 obj id)
  10.       (vla-objectidtoobject obj id)
  11.       ) ;_ end of if
  12.     ) ;_ end of defun
  13.  
  14.   (if
  15.     (and (= (type (setq selset (vl-catch-all-apply
  16.                                  (function
  17.                                    (lambda ()
  18.                                      (ssget "_+.:L:S" '((0 . "*TEXT")))
  19.                                      ) ;_ end of lambda
  20.                                    ) ;_ end of function
  21.                                  ) ;_ end of vl-catch-all-apply
  22.                         ) ;_ end of setq
  23.                   ) ;_ end of type
  24.             'pickset
  25.             ) ;_ end of =
  26.          (setq selset (vlax-ename->vla-object (ssname selset 0)))
  27.          (= (type
  28.               (setq pt (vl-catch-all-apply
  29.                          (function (lambda () (getpoint "\nТочка, от которой будет строиться мультивыноска <Отмена> : ")))
  30.                          ) ;_ end of vl-catch-all-apply
  31.                     ) ;_ end of setq
  32.               ) ;_ end of type
  33.             'list
  34.             ) ;_ end of =
  35.          pt
  36.          ) ;_ end of and
  37.      (progn
  38.        (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  39.        (setq
  40.          ml (vla-addmleader (_kpblc-objectidtoobject adoc (vla-get-ownerid selset))
  41.                             (vlax-make-variant
  42.                               (vlax-safearray-fill
  43.                                 (vlax-make-safearray vlax-vbdouble
  44.                                                      '(0 . 5)
  45.                                                      ) ;_ end of vlax-make-safearray
  46.                                 (append pt (vlax-safearray->list (vlax-variant-value (vla-get-insertionpoint selset))))
  47.                                 ) ;_ end of vlax-safearray-fill
  48.                               ) ;_ end of vlax-make-variant
  49.                             1
  50.                             ) ;_ end of vla-addmleader
  51.          ) ;_ end of setq
  52.        (vla-put-contenttype ml 2)
  53.        (vla-put-textstring ml (vla-get-textstring selset))
  54.        (vla-erase selset)
  55.        (vla-endundomark adoc)
  56.        ) ;_ end of progn
  57.      ) ;_ end of if
  58.   (princ)
  59.   ) ;_ end of defun
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн АлексейТАвтор темы

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
Re: Создание мультивыносок
« Ответ #12 : 28-04-2015, 17:12:35 »
Посоветуйте пожалуйста а как сделать лисп устанавливающий
скрытие заднего плана с заданным коэффициентом для всех
мультивыносок чертежа!

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1116
  • Карма: 173
Re: Создание мультивыносок
« Ответ #13 : 28-04-2015, 17:14:14 »
Один вопрос = одна тема.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!