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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Выбор примитивов в функции (command)

Выбор примитивов в функции (command)

Ответ
Поиск в этой теме
Непрочитано 13.05.2006, 15:28 #1
Выбор примитивов в функции (command)
mmax
 
Программист широкого профиля.
 
Челябинск
Регистрация: 08.09.2005
Сообщений: 722

Надоело лишний раз жать ENTER в командах _MIRROR и _ROTATE
В первой после всех операций надо сказать _Y _N, во второй выбирать опорный угол _REFERENS
Решил этот процесс автоматизировать, но столкнулся с проблемой выбора примитивов
Пример:
Код:
[Выделить все]
(vl-cmdf “_mirror” pause pause pause pause “_N”)
здесь я могу выбрать соответственно только 4 примитива и только щелчком по примитиву, промах тоже защитывается как выбор, если выбрать больше то вылетает ошибка, и нельзя выбирать рамкой.
Скажите пожалуйста как более гибко реализовать выбор примитивов в функции?
В данный момент написал pause 20 раз, но вот невозможность выбора рамкой сильно портит ситуацию.
Просмотров: 6291
 
Непрочитано 14.05.2006, 09:56
#2
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Если используя VL-CMDF...
Код:
[Выделить все]
(vl-cmdf "_.mirror" (ssget) "" pause pause "_N")
(vl-cmdf "_.rotate" (ssget) "" pause "_R" pause pause pause)
Елпанов Евгений вне форума  
 
Непрочитано 15.05.2006, 09:05
#3
Кулик Алексей aka kpblc
Moderator

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


А если так?
Код:
[Выделить все]
(defun c:mod-mirror (/ adoc selset)
  (vl-load-com)
  (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  (vla-startundomark adoc)
  (if (not (setq selset (ssget "_I")))
    (setq selset (ssget "_:L"))
    ) ;_ end of if
  (command "_.mirror" selset "" pause pause "_n")
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 15.05.2006, 20:52
#4
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Всем спасибо.
Первый вариант уже работает.

Кстати все Стандартные акадовские команды почемуто сделаны так, что первое действие используется редко, постоянно надо либо опцию указывать или контекстное меню вызывать например _break вообще ни в какие ворота не лезет.

я уже почти все команды общего редактирования отрихтовал.
mmax вне форума  
 
Непрочитано 15.05.2006, 21:02
#5
Profan


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


В команде "_Break" ("Разорвать") в первом действии ("Выберите объект") вообще нет ни опций, ни контекстного меню.
Profan вне форума  
 
Автор темы   Непрочитано 16.05.2006, 05:01
#6
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
В команде "_Break" ("Разорвать") в первом действии ("Выберите объект") вообще нет ни опций, ни контекстного меню.
Вот я и говорю, что она на ни в одни ворота не лезет

Со вчерашнего дня работаю так:
Код:
[Выделить все]
;Оборвать
(Defun c:brek ()
  (vl-cmdf "_.break" pause "_f")
(princ)
  )
Намой взгляд так намного удобнее.
А опцию она имеет "First point"
mmax вне форума  
 
Непрочитано 16.05.2006, 06:13
#7
Profan


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


Я так понимаю, что выбор объекта в команде "_Break" ("Разорвать") происходит аналогично выбору объекта с помощью функции AutoLisp'а (entcel), т.е. при выборе объекта одновременно определяется первая точка для разрыва. Поэтому здесь можно применять некоторые привязки.
Profan вне форума  
 
Автор темы   Непрочитано 19.05.2006, 00:18
#8
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Насчет привязок идея хорошая, надо помозговать.
mmax вне форума  
 
Автор темы   Непрочитано 19.05.2006, 01:22
#9
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Код:
[Выделить все]
(defun c:brek (/ *error* olderror 1po 2po echo_old)
  (setq echo_old (getvar "cmdecho"))

(defun *error* (msg / )
  (setq olderror *error*)
  (princ "\" отмена оборвать\"")
  (setvar "cmdecho" echo_old)
  (setq *error* olderror)
  (princ)
  )

(setq 1po (getpoint "\nУкажите первую точку :"))
      (princ 1po)
(setq 2po (getpoint "\nУкажите вторую точку :"))
      (princ 2po)

(setvar "cmdecho" 0)

(if (vl-cmdf "_.break" pause "_f" 1po 2po)
      (setvar "cmdecho" echo_old)
      (setvar "cmdecho" echo_old))
(princ)
  )

Вот еще более удачный вариант _Break.

И еще раз спасибо всем кто мне помог.
mmax вне форума  
 
Непрочитано 19.05.2006, 08:45
#10
Кулик Алексей aka kpblc
Moderator

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


Можно покритиковать?
Немного не совсем Зачем делается печать полученной точки? Попробуй такое, может, больше понравится:
Код:
[Выделить все]
(defun c:mbreak	(/ adoc *error* _cmdecho_ start_point end_point)
  (defun *error* (msg)
    (if	_cmdecho_
      (setvar "cmdecho" _cmdecho_)
      ) ;_ end of if
    (vla-endundomark adoc)
    (princ msg)
    (princ)
    ) ;_ end of defun
  (vl-load-com)
  (setq	adoc	  (vla-get-activedocument (vlax-get-acad-object))
	_cmdecho_ (getvar "cmdecho")
	) ;_ end of setq
  (vla-startundomark adoc)
  (if (and (setq start_point (getpoint "\nНачальная точка обрыва <Выход> : "))
	   (setq
	     end_point (getpoint start_point "\nКонечная точка обрыва <Выход> : ")
	     ) ;_ end of setq
	   ) ;_ end of and
    (progn
      (setvar "cmdecho" 0)
      (command "_.break" pause "_f" start_point end_point)
      (setvar "cmdecho" _cmdecho_)
      ) ;_ end of progn
    ) ;_ end of if
  (vla-endundomark adoc)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 19.05.2006, 11:59
#11
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


-->kpblc
Чем дальше в лес тем больше дров.

Но есть еще одна проблема в вашей и моей программе
Если в функции (сommad) на этапе выбора промахнуться, то функция выдает nil, а автокад продолжает дальше сам чегото делать.
Причем я не могу понять чего он просит.
Учитывая то что мне надо выполнить конкретное действие, а я случайно промахнулся, то дальнейшие действия предлагаемые автокадом мне не подходят. Вот здесь бы не помешал бы возврат в (сommand). А вот у акадовской _break выдается - объект не найден и педлагается выбирать дальше.

Как навести порядок при выборе объектов. ??????????????????
mmax вне форума  
 
Непрочитано 19.05.2006, 12:27
#12
Кулик Алексей aka kpblc
Moderator

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


> mmax : молю, меня - один!
Несколько вопросов (и вариантов сразу):
- Надо обязательно выбирать 1 элемент, и, если не выбран, выходить? Если да, то
Код:
[Выделить все]
(defun c:mbreak1 (/ adoc *error* _cmdecho_ start_point end_point ent)
  (defun *error* (msg)
    (if	_cmdecho_
      (setvar "cmdecho" _cmdecho_)
      ) ;_ end of if
    (vla-endundomark adoc)
    (princ msg)
    (princ)
    ) ;_ end of defun
  (vl-load-com)
  (setq	adoc	  (vla-get-activedocument (vlax-get-acad-object))
	_cmdecho_ (getvar "cmdecho")
	) ;_ end of setq
  (vla-startundomark adoc)
  (if
    (and (setq ent (entsel "\nОбъект для обрезки <Выход> : "))
	 (setq start_point (getpoint "\nНачальная точка обрыва <Выход> : "))
	 (setq
	   end_point (getpoint start_point "\nКонечная точка обрыва <Выход> : ")
	   ) ;_ end of setq
	 ) ;_ end of and
     (progn
       (setvar "cmdecho" 0)
       (command "_.break" (car ent) "_f" start_point end_point)
       (setvar "cmdecho" _cmdecho_)
       ) ;_ end of progn
     ) ;_ end of if
  (vla-endundomark adoc)
  ) ;_ end of defun
- надо провернуть на наборе? Тогда так:
Код:
[Выделить все]
(defun c:mbreak2 (/ adoc *error* _cmdecho_ start_point end_point selset)
  (defun *error* (msg)
    (if	_cmdecho_
      (setvar "cmdecho" _cmdecho_)
      ) ;_ end of if
    (vla-endundomark adoc)
    (princ msg)
    (princ)
    ) ;_ end of defun
  (vl-load-com)
  (setq	adoc	  (vla-get-activedocument (vlax-get-acad-object))
	_cmdecho_ (getvar "cmdecho")
	) ;_ end of setq
  (vla-startundomark adoc)
  (if
    (and (setq selset (ssget))
	 (setq start_point (getpoint "\nНачальная точка обрыва <Выход> : "))
	 (setq
	   end_point (getpoint start_point "\nКонечная точка обрыва <Выход> : ")
	   ) ;_ end of setq
	 ) ;_ end of and
     (progn
       (setvar "cmdecho" 0)
       (foreach	item (vl-remove-if 'listp (mapcar 'cadr (ssnamex selset)))
	 (command "_.break" item "_f" start_point end_point)
	 ) ;_ end of foreach
       (setvar "cmdecho" _cmdecho_)
       ) ;_ end of progn
     ) ;_ end of if
  (vla-endundomark adoc)
  ) ;_ end of defun
- надо обязательно дождаться выбора объекта? Тогда таким образом:
Код:
[Выделить все]
(defun c:mbreak3 (/ adoc *error* _cmdecho_ start_point end_point ent)
  (defun *error* (msg)
    (if	_cmdecho_
      (setvar "cmdecho" _cmdecho_)
      ) ;_ end of if
    (vla-endundomark adoc)
    (princ msg)
    (princ)
    ) ;_ end of defun
  (vl-load-com)
  (setq	adoc	  (vla-get-activedocument (vlax-get-acad-object))
	_cmdecho_ (getvar "cmdecho")
	) ;_ end of setq
  (vla-startundomark adoc)
  (while (not (setq ent (entsel "\nУкажите обрезаемый объект <Выход> :")))
    (princ "\nНичего не выбрано, повторяем")
    ) ;_ end of while
  (if
    (and (setq start_point (getpoint "\nНачальная точка обрыва <Выход> : "))
	 (setq
	   end_point (getpoint start_point "\nКонечная точка обрыва <Выход> : ")
	   ) ;_ end of setq
	 ) ;_ end of and
     (progn
       (setvar "cmdecho" 0)
       (command "_.break" (car ent) "_f" start_point end_point)
       (setvar "cmdecho" _cmdecho_)
       ) ;_ end of progn
     ) ;_ end of if
  (vla-endundomark adoc)
  ) ;_ end of defun
Работу не проверял, так что прошу не бить ногами
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 19.05.2006, 20:02
#13
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


А иногда бывает, надо выбрать определенный примитив, например полилинию. А иногда бывает......................................................

Впринципе код в сообщении №6 уже ускорил мою работу с командой _break.
А вообще я не могу понять зачем изначально Автодеск сделал одновременный выбор примитива в точке разрыва.
Незнаю как другие, но если на чертеже, допустим, прямоугольная деталь перекрывает круглую, у которой радиус известен, то обычно я сначала рисую окружность потом прямоугольник, а потом окружность обрываю в точках пересечения окружности с прямоугольником по привязкам. В стандартном варианте при выборе примитива первая точка обрыва никак не совпадала с точкой пересечения, для чего приходилось оттягивать получившуюся дугу к точке пересечения. Поэтому надо точки выбирать в начале, а потом объект, или самое лучшее -- в стандартном варианте при выборе привязываться к точке пересечения, чтобы сразу и объект выбрать и правильную точку.
mmax вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Выбор примитивов в функции (command)

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

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