Как "обрубить хвосты" команде Автокад, выполняемой в коде?
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как "обрубить хвосты" команде Автокад, выполняемой в коде?

Как "обрубить хвосты" команде Автокад, выполняемой в коде?

Ответ
Поиск в этой теме
Непрочитано 26.06.2014, 15:05 #1
Как "обрубить хвосты" команде Автокад, выполняемой в коде?
mkung
 
RUSSIA
Регистрация: 05.09.2007
Сообщений: 166

В программе надо выполнить команду Автокад, а потом выбрать объект. Пример:
Код:
[Выделить все]
 (command "_.MSPACE")
(setq ob (entget (car (entsel "Выберите дугу:"))))
Получается с ошибкой:
_.MSPACE
Команда: Выберите дугу:
Повторный вход в LISP невозможен.
*Неверный выбор*
Требуется точка или Последний
Выберите дугу:

Видно, что на запрос падают какие-то хвосты от команды.
Разносил эти строки по разным функциям - никакого результата.
Как выполнить команду, чтобы она не мешала последующему выбору?
Просмотров: 4456
 
Непрочитано 26.06.2014, 16:15
#2
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,834
<phrase 1=


Командные методы плохи тем, что надо отслеживать различные опции...
В данном случае команда _.MSPACE применима в пространстве листа, а в пространстве Модель она не нужна.
Можно как-то так
Код:
[Выделить все]
(if (/= (getvar "CTAB") "Model")
  (command "_.MSPACE"))
(setq ob (entget (car (entsel "  Выберите дугу:"))))
__________________
По теории майский жук летать не может.
Но он этого не знает. И летает...
Alan вне форума  
 
Непрочитано 26.06.2014, 18:19
#3
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,194


Цитата:
Сообщение от mkung Посмотреть сообщение
Получается с ошибкой:
_.MSPACE
Команда: Выберите дугу:
Повторный вход в LISP невозможен.
*Неверный выбор*
Требуется точка или Последний
Выберите дугу:
Приведенная ошибка во всех случаях вызова выложенного фрагмента кода (из листа с одним и несколькими ВЭ, без ВЭ, и из модели) не возникала. Может, у Вас в контексте большой программы гадят "хвосты" предыдущей команды?
Акад 2010 без сервис-паков и верт. приложений.

PS А выбирать ту самую дугу обязательно через видовой экран? Переключиться в основное пространство модели как-то надежнее, IMHO.

Последний раз редактировалось kp+, 26.06.2014 в 18:25.
kp+ вне форума  
 
Автор темы   Непрочитано 27.06.2014, 13:56
#4
mkung


 
Регистрация: 05.09.2007
RUSSIA
Сообщений: 166


Цитата:
Сообщение от kp+ Посмотреть сообщение
Приведенная ошибка во всех случаях вызова выложенного фрагмента кода (из листа с одним и несколькими ВЭ, без ВЭ, и из модели) не возникала. Может, у Вас в контексте большой программы гадят "хвосты" предыдущей команды?
Акад 2010 без сервис-паков и верт. приложений.

PS А выбирать ту самую дугу обязательно через видовой экран? Переключиться в основное пространство модели как-то надежнее, IMHO.
У меня одно и то же в 2011 и 2014.
Результат должен быть в пространстве листа. Если несколько ВЭ, то переносить по пространствам геморройно.
Вот листинг (рабочий вариант):
Код:
[Выделить все]
 (vl-load-com)
  (if (= (getvar "TILEMODE") 1) (alert "Программа работает в пространстве листа.\nПерейдите в нужный лист и запустите программу снова.")) ;если в модели
  (if (= (getvar "TILEMODE") 0)
   (progn
    (setq name_lay (vla-get-name (vla-get-ActiveLayout (vla-get-ActiveDocument (vlax-get-acad-object))))) ;имя текущего листа
    (setq nabor_vp (ssget "_x" (list '(0 . "VIEWPORT") '(67 . 1) (cons 410 name_lay)))) ;набор вьюпортов активного листа
    (setq kol_vp (sslength nabor_vp)) ;количество элементов в наборе
    (cond ((> kol_vp 2)
	       (progn
	        (command "_.MSPACE")
		(alert "При необходимости смены активного видового экрана укажите его мышью.")
	       ) ;конец progn
	   )
	  ((= kol_vp 2)
	       (command "_.MSPACE"))
	  ((= kol_vp 1)
	       (alert "В листе нет видового экрана."))
    ) ;конец cond
   ) ;конец progn
  ) ;конец if
(if (> kol_vp 1)
  (progn
	(setq sel_dug (entsel "Выберите дугу:"))
    	(while (null sel_dug) (setq sel_dug (entsel "Пустой выбор. Выберите дугу:")))
        (setq ob (entget (car sel_dug)))
	(while (/= (cdr (assoc 0 ob)) "ARC")
	  (progn
	    (setq sel_dug (entsel "Выбранный объект не является дугой. \nВыберите дугу:"))
	    (while (null sel_dug) (setq sel_dug (entsel "Пустой выбор. Выберите дугу:")))
	    (setq ob (entget (car sel_dug)))
	  ) ;конец progn
	) ;конец while
	(command "_.PSPACE")
        ; центр дуги
	(setq cd (cdr (assoc 10 ob)))
	; радиус дуги
	(setq rd (cdr (assoc 40 ob)))
	; начальный угол
	(setq nu (cdr (assoc 50 ob)))
	; конечный угол
	(setq ku (cdr (assoc 51 ob)))
	; угол дуги
	(if (< nu ku) (setq ug (- ku nu)) (setq ug (- (* 2 pi) (- nu ku))))
	; длина дуги
	(setq dd (* ug rd))
	; текст длина дуги десятичная дробь до одного знака
	(setq tdd (rtos dd 2 1))
	(if (vl-string-search "." tdd) (setq tdd (vl-string-subst "," "." tdd)))
	; текст радиус дуги десятичная дробь до целого
	(setq trd (rtos rd 2 0))
	; текст угол дуги градусы_минуты
	(setq tug (angtos ug 1 1))
	(setq tug (vl-string-subst (chr 176) "d" tug))
	(if (vl-string-search (strcat (chr 176) "0'") tug)
	  (setq tug (vl-string-right-trim "0'" tug))
	)
	(setq verh (strcat "R=" trd ", " "\\U+03B1" "=" tug ))
	(setq niz (strcat "Kp=" tdd))
	(vl-cmdf "_.PSPACE")
	(setq nvyn (getpoint "\nУкажите начало выноски:"))
	(setq npol (getpoint "\nУкажите начало полки:"))
	(command "_mleader" nvyn npol (strcat verh "\\P" niz))
	(setq n_mv (vlax-ename->vla-object (entlast)))
	(vla-put-StyleName n_mv "3.5_SPDS_GAL")
	(vla-put-Layer n_mv "ГМО_Разрезы_Выноски_и_пр")
	(vla-put-TextJustify n_mv "2")
  ) ;конец progn
) ;конец if 
Еще приложу файл для экспериментов.
Вложения
Тип файла: dwg
DWG 2010
дуга_2010.dwg (409.6 Кб, 852 просмотров)
mkung вне форума  
 
Непрочитано 02.07.2014, 12:29
#5
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,834
<phrase 1=


Цитата:
Сообщение от kp+ Посмотреть сообщение
Приведенная ошибка во всех случаях вызова выложенного фрагмента кода (из листа с одним и несколькими ВЭ, без ВЭ, и из модели) не возникала. ...
Акад 2010 без сервис-паков и верт. приложений.
Подтверждаю с чертежом "дуга_2010.dwg"

У вас всего две команды (command "_.MSPACE") и (vl-cmdf "_.PSPACE"), не имеющие никаких опций.
Откуда видите "какие-то хвосты от команды"? М.б. что-то в автозагрузке есть?
Цитата:
PS А выбирать ту самую дугу обязательно через видовой экран? Переключиться в основное пространство модели как-то надежнее, .
Согласен.
IMHO. Ваш Лисп практически полностью повторяет стандартные команды Автокада, автоматизируя только создание строки выноски
Код:
[Выделить все]
(setq verh (strcat "R=" trd ", " "\\U+03B1" "=" tug ))
	(setq niz (strcat "Kp=" tdd))
Ну... Большое путешествие начинается с первого шага. Удачи!
__________________
По теории майский жук летать не может.
Но он этого не знает. И летает...
Alan вне форума  
 
Автор темы   Непрочитано 02.07.2014, 13:19
#6
mkung


 
Регистрация: 05.09.2007
RUSSIA
Сообщений: 166


Цитата:
Сообщение от Alan Посмотреть сообщение
У вас всего две команды (command "_.MSPACE") и (vl-cmdf "_.PSPACE"), не имеющие никаких опций.
Откуда видите "какие-то хвосты от команды"? М.б. что-то в автозагрузке есть?
1. Исключаю MSPACE из кода.
2. Активирую модель в нужном видовом экране.
3. Запускаю программу.
Никаких "хвостов". Чистый запрос "Выберите дугу:"
Убедил?
mkung вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как "обрубить хвосты" команде Автокад, выполняемой в коде?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При команде File/open автокад виснет намертво Ortemk AutoCAD 32 25.02.2019 17:33
Автокад 2011 виснет на команде save, toxito AutoCAD 7 18.05.2016 13:02