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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Изменение свойств XLine

Изменение свойств XLine

Ответ
Поиск в этой теме
Непрочитано 01.07.2004, 18:28 #1
Изменение свойств XLine
Ze Tro
 
Одесса Украина
Регистрация: 18.05.2004
Сообщений: 35

Буду сегодня назойлив.
Есть вот такая вещь "(command "color" "1")+(command "_xline" pause pause ok)+(command "color" "ByLayer")".
Все делает верно. Знаю как написать, кажеться тремя вариантами. Но проблема в том, что "Пауза" разрешает ввод мышкой только 2-а раза. А задача в том, чтоб ХЛиния рисовалась бесконечно, но при этом изменяя свой цвет.
Просмотров: 4692
 
Непрочитано 01.07.2004, 19:28
#2
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Немного непонятен вопрос по изменению свойств XLine, когда телепатия подсказывает, что проблема состоит в зацикливании.

Один из простейших способов
Код:
[Выделить все]
(while t
здесь пишешь все что надо зациклить
............
...........
) ;_ end while
А по хорошему, надо делать условие для выхода из while и тогда вид будет немного другой
Код:
[Выделить все]
(while (progn
здесь все что надо зациклить
.............
..............
t - условие продолжения или nil для выхода
) ;_ end progn
) ;_ end while
И в цикле уже вычислять и назначать свойства, тоесть цвет в данном случае...
vk вне форума  
 
Непрочитано 01.07.2004, 19:40
#3
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Код:
[Выделить все]
(setq c 1)
(while t
  (command "_.color" c)
  (command "_.xline" pause pause "")
  (setq c (if (= 8 c)
            1
            (1+ c)
          ) ;_  if
  ) ;_  setq
) ;_  while
Не знаю, какое условие для выхода, потому оставил выход по Escape.
И алгоритм назначения цвета тоже....
vk вне форума  
 
Автор темы   Непрочитано 02.07.2004, 18:55
#4
Ze Tro


 
Регистрация: 18.05.2004
Одесса Украина
Сообщений: 35


Огромное СПСБ за помощь.... Очень была к стати..Хотя много все равно осталось не ясным....

Вот то, что требовалось
(while t
(command "_.xline" pause pause "" )
(command "chprop" "Last" "" "C" 1 "")
) ;_ while
И что значит, что оставил выход по Escape, а как по ENTER.
Ze Tro вне форума  
 
Непрочитано 21.07.2004, 19:55
#5
LinkFly


 
Сообщений: n/a


Вы бы почитали сначала, к примеру Николая Полещука. А то вы так на весь форум вопросами разродитесь )
---------------
С уважением.
 
 
Непрочитано 21.07.2004, 20:33
#6
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


>LinkFly
А почему бы и нет. Во время обсуждения простейших вопросов порой возникают интересные дискурсии. Тем более что у Полещук скорее справочник по функциям ЛИСП и только в чуть чуть пособие по применению этих самых функций.
{Smirnoff} вне форума  
 
Непрочитано 21.07.2004, 21:14
#7
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от Ze Tro
И что значит, что оставил выход по Escape, а как по ENTER.
Это значит, что для выхода из цикла надо просто нажать Escape. Конечно же можно вместо банального t в условии цикла сделать функцию (диалог с пользователем), которая запрашивала бы нечто вроде

Продолжить [Yes/No] <Yes>:

и анализировала ответ пользователя. Это вроде бы считается "корректным" или "хорошим тоном". НО!!! Тогда в каждом проходе цикла потребуется дополнительный ввод - <Enter> для продолжения или n <Enter> (сокращенно от No) для завершения. Вместо Enter'а можно и пробел использовать.

Мне кажется, что выход "по Escape" в данном случае проще. Программа будет работать до тех пор, пока ее "нагло" не оборвут.
vk вне форума  
 
Непрочитано 22.07.2004, 09:54
#8
Alaspher


 
Сообщений: n/a


Цитата:
Это значит, что для выхода из цикла надо просто нажать Escape. Конечно же можно вместо банального t в условии цикла сделать функцию (диалог с пользователем), которая запрашивала бы нечто вроде

Продолжить [Yes/No] <Yes>:

и анализировала ответ пользователя. Это вроде бы считается "корректным" или "хорошим тоном". НО!!! Тогда в каждом проходе цикла потребуется дополнительный ввод - <Enter> для продолжения или n <Enter> (сокращенно от No) для завершения. Вместо Enter'а можно и пробел использовать.

Мне кажется, что выход "по Escape" в данном случае проще. Программа будет работать до тех пор, пока ее "нагло" не оборвут.
Очень нехороший вариант. Прерывание только по 'Esc' - неприемлемый стиль программирования. Тем более, что ничего не мешает сделать грамотно, хотя-б так:
Код:
[Выделить все]
(defun c:cxline (/ cur sec)
  (setq cur (getvar "cecolor")
        sec (acad_colordlg
              (cond ((= cur "BYLAYER") 256)
                    ((= cur "BYBLOCK") 0)
                    (t (atoi cur))
              ) ;_ end of cond
            ) ;_ end of acad_colordlg
  ) ;_ end of setq
  (setvar "cecolor"
          (cond ((numberp sec) (itoa sec))
                ((or (= sec 256) (= sec 0) (not sec)) (setq sec 1))
          ) ;_ end of cond
  ) ;_ end of setvar
  (while (progn (vl-cmdf "_.xline" pause)
                (not (zerop (getvar "cmdactive")))
         ) ;_ end of progn
    (vl-cmdf pause "")
    (setvar "cecolor"
            (itoa (setq sec (cond ((= sec 256) 1)
                                  (t (1+ sec))
                            ) ;_ end of cond
                  ) ;_ end of setq
            ) ;_ end of itoa
    ) ;_ end of setvar
  ) ;_ end of while
  (setvar "cecolor" cur)
  (princ)
) ;_ end of defun
Если надо, то можете организовать нужные приглашения пользователю - это лучше делать по контексту задачи - будет нагляднее.
 
 
Непрочитано 22.07.2004, 13:11 корректрровка
#9
Alaspher


 
Сообщений: n/a


Напутал немного (сорри - за 5 минут сделано, не факт, что всё учёл), исправленный код:
Код:
[Выделить все]
(defun c:cxline (/ cur sec)
  (setq cur (getvar "cecolor")
        sec (acad_colordlg
              (cond ((= cur "BYLAYER") 256)
                    ((= cur "BYBLOCK") 0)
                    (t (atoi cur))
              ) ;_ end of cond
            ) ;_ end of acad_colordlg
  ) ;_ end of setq
  (setvar "cecolor"
          (itoa (cond ((or (= sec 256) (= sec 0) (not sec)) (setq sec 1))
                      ((numberp sec) sec)
                      (t (setq sec 1))
                ) ;_ end of cond
          ) ;_ end of itoa
  ) ;_ end of setvar
  (while (progn (vl-cmdf "_.xline" pause)
                (not (zerop (getvar "cmdactive")))
         ) ;_ end of progn
    (vl-cmdf pause "")
    (setvar "cecolor"
            (itoa (setq sec (cond ((= sec 256) 1)
                                  (t (1+ sec))
                            ) ;_ end of cond
                  ) ;_ end of setq
            ) ;_ end of itoa
    ) ;_ end of setvar
  ) ;_ end of while
  (setvar "cecolor" cur)
  (princ)
) ;_ end of defun
 
 
Непрочитано 22.07.2004, 17:14
#10
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


>Alaspher
Цитата:
Прерывание только по 'Esc' - неприемлемый стиль программирования.
Может и так... Только в AutoDesk решили, что такой стиль имеет полное право на жизнь и используют для зацикливания команд в меню * (звездочку). При таком "неприемлемом стиле" единственным выходом остается ESC.

Для примера в АКАД2005: Draw -> Point -> Multiple point
vk вне форума  
 
Непрочитано 23.07.2004, 08:23
#11
Alaspher


 
Сообщений: n/a


>vk
Цитата:
...в AutoDesk решили, что такой стиль имеет полное право на жизнь и используют для зацикливания команд в меню * (звездочку). При таком "неприемлемом стиле" единственным выходом остается ESC.
Почему multiple прерывается только Esc - вполне понятно, на то это и спец. режим, а совсем не "команда". Команда multiple его включает, но выполняется в этом режиме другая команда (не обязательно point). В Лиспе, для повтора чего бы то нибыло, принято использовать другие способы.
Цитата:
Для примера в АКАД2005: Draw -> Point -> Multiple point
А вот какого беса команда point не прерывается пустым вводом или пробелом (и это совсем не особенность R16) - эта загадка для меня осталась нерешённой. Явно ведь, что при первичной разработке этой команды, просто - лажанулся кодер, но, вот зачем эту лажу закрепили..., но это не единственная плюха Autodesk'овских программеров, которая меня изумляет. Видимо, торопятся очень...
 
 
Непрочитано 23.07.2004, 14:30
#12
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Торопятся.... Да еще как....
POINT требует ввода первого и вместе с тем, единственного аргумента - указания координат точки. Пока не удовлетворится - так и будет спрашивать.
LINE, CIRCLE и некоторые другие также не воспринимают пустой ввод в качестве первого аргумента и требуют, требуют....
-INSERT при пустом вводе в начале заявляет, что "ошиблись номером", а COPY и MOVE - тихо отваливают (если не были заранее выбраны примитивы)
Полный бардак? Нет.
Все совершенно логично. По первым примерам - как в шахматах, "взялся - ходи!". По последним - нет объектов- нечего делать.

Выход по Enter необходим для корректной работы в кнопочном макросе и в скрипте. Там по другому пожалуй, никак...

По существу "шума" вокруг "выхода по Esc"... Ни в коем разе НЕ призываю к "ТОЛЬКО по Esc"! Однако, выход по Esc имеется из любой штатной команды. Не всегда корректный

Что касается звездочки... Наверняка, 90% пользователей (не путать с посетителями форума) не знают о ее существовании. И давят Esc потому что "так надо". И нет им разницы команда это, программа или спецрежим.
vk вне форума  
 
Непрочитано 23.07.2004, 15:21
#13


 
Сообщений: n/a


Цитата:
Сообщение от vk
По существу "шума" вокруг "выхода по Esc"... Ни в коем разе НЕ призываю к "ТОЛЬКО по Esc"! Однако, выход по Esc имеется из любой штатной команды. Не всегда корректный
Так ведь я не призываю не обрабатывать пользовательский Esc. Как раз наоборот - обрабатывать его надо обязательно, благо теперь есть чем. Но в примере, на который я отпостился первый раз, нет обработки Esc, а функция заведомо не имеет корректного выхода. Предусматривая прерывание Esc'ейпом - предусмотрите его. В моём коде, такое прерывание, заканчивается штатным выходом и если такое случится, что она будет вызвана из другой функции, то при выходе не убъёт вызывающую.
 
 
Непрочитано 23.07.2004, 15:34
#14
Alaspher


 
Сообщений: n/a


Предыдущий пост мой. Сорри.
 
 
Непрочитано 23.07.2004, 16:51
#15
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Вы про то сообщение, которое "Добавлено: Чт Июл 01, 2004 19:40"?
Как таковой, законченной функции или команды там вобще нет... Фрагмент кода, не более. Кроме того, там же и приписочка есть
Цитата:
Не знаю, какое условие для выхода, потому оставил выход по Escape.
Исключительно в целях упрощения, млиииннннн....

Кроме того, там не реализован выбор цвета - просто тупо назначено исходное значение........
И алгоритм изменения цвета...
Все по "техзаданию"
Цитата:
А задача в том, чтоб ХЛиния рисовалась бесконечно, но при этом изменяя свой цвет.
Простенькая демка на тему "что такое WHILE"

Структура с корректным выходом из WHILE - постом выше, в 19:28
vk вне форума  
 
Непрочитано 25.08.2010, 16:31
#16
Pipe

инженер ОВиК
 
Регистрация: 20.11.2006
Москва
Сообщений: 115


Тоже проблема с xline. Может, баг акада. У меня 2009.
Происходит при указании точки вставки не в пустом поле, а при привязке к объекту. Рисую луч. Указываю точку, но луч в неё не становится, а начинается таскаться дальше за курсором причём ещё с каким-то произвольным отступом и наклоном. Или ещё хуже бывает. Тыкаю точку, во все стороны мелькают направляющие пунктиры, а линию саму не видно и довести команду до конца не возможно.
Как эту ошибку победить, народ? Или 2009 неизлечим?

Последний раз редактировалось Pipe, 25.08.2010 в 16:37.
Pipe вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Изменение свойств XLine