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

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

Перемещение отрезка в LISP

Ответ
Поиск в этой теме
Непрочитано 26.11.2007, 13:51 #1
Перемещение отрезка в LISP
AlexeySh
 
Регистрация: 26.11.2007
Сообщений: 60

Извините, если это банально просто, но я изучаю LISP второй день, а результат нужен уже...
Вообщем, нужно передвинуть выбранный отрезок на какое-то указанное расстояние (кол-во единиц) в сторону от точки (можно тоже указанной на экране или с указанными координатами) параллельно самому себе.
Заранее спасибо.
Просмотров: 9125
 
Непрочитано 26.11.2007, 14:19
#2
Profan


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


Код:
[Выделить все]
 
(defun C:L_MOVE ( / echo)
(setq echo (getvar "CMDECHO"))
(setvar "CMDECHO" 1)
(command "_MOVE")
(setvar "CMDECHO" echo)
(princ)
)
Profan вне форума  
 
Автор темы   Непрочитано 26.11.2007, 14:37
#3
AlexeySh


 
Регистрация: 26.11.2007
Сообщений: 60


Понятно...
Т.е. нужно вызвать команду автокада move с параметром расстояние перемещения? (Расстояние перемещения будет рассчитываться в другой функции.)
А перед этим не нужно выбор объекта делать?

Кстати, подскажите, пожалуйста, где можно взять список команд автокада с параметрами(!). Везде искал и везде списки без параметров, а у меня еще русский автокад, и хелп в нем соответствующий.
AlexeySh вне форума  
 
Непрочитано 26.11.2007, 14:43
#4
Profan


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


Я слегка сконфужен.
Profan вне форума  
 
Автор темы   Непрочитано 26.11.2007, 14:59
#5
AlexeySh


 
Регистрация: 26.11.2007
Сообщений: 60


В каком смысле? Что-то неясно объяснил?
AlexeySh вне форума  
 
Непрочитано 26.11.2007, 15:05
#6
Profan


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


Лучше всего иметь два AutoCAD'а - русский и английский...
Profan вне форума  
 
Автор темы   Непрочитано 26.11.2007, 15:08
#7
AlexeySh


 
Регистрация: 26.11.2007
Сообщений: 60


А в английской версии параметры корректно описаны?
AlexeySh вне форума  
 
Непрочитано 26.11.2007, 15:16
#8
Profan


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


Как правило, в английских версиях описано все правильно. В русских локализациях бывают огрехи.
Profan вне форума  
 
Автор темы   Непрочитано 26.11.2007, 15:44
#9
AlexeySh


 
Регистрация: 26.11.2007
Сообщений: 60


Хорошо.
Так что с главной задачей? Как мне команду _move с параметрами корректно написать?
AlexeySh вне форума  
 
Непрочитано 26.11.2007, 15:59
#10
Profan


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


Я ведь привел исключительно примитивный пример...
Profan вне форума  
 
Автор темы   Непрочитано 26.11.2007, 16:13
#11
AlexeySh


 
Регистрация: 26.11.2007
Сообщений: 60


Цитата:
Сообщение от AlexeySh Посмотреть сообщение
Т.е. нужно вызвать команду автокада move с параметром расстояние перемещения? (Расстояние перемещения будет рассчитываться в другой функции.)
А перед этим не нужно выбор объекта делать?
Очень тяжело дополнить его до расширенного варианта с переменной расстояния и выбором объекта отрезка?
AlexeySh вне форума  
 
Непрочитано 26.11.2007, 16:22
#12
Кулик Алексей aka kpblc
Moderator

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


А что должно быть параметрами? Там же можно в качестве параметров передавать указатель на перемещаемый примитив; указатель на сформированный набор примитивов; начальную точку; конечную точку - и все это в разных сочетаниях...
---
Опа, что значит не нажать сразу "Отправить"... Но вопрос в общем-то остается в силе.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.11.2007, 16:25
1 | #13
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Может так понятней будет
Код:
[Выделить все]
(defun C:L_MOVE ( / echo line dist)
(setq echo (getvar "CMDECHO"))
(setq dist 100) ;_Расстояние перемещения, расчитанное в другой программе  
(setq line (ssget "_:L:S:E" '((0 . "LINE"))))
       ;_ Выбор отрезка опции ssget
       ;_   :L - не выбирать на заблокированных слоях
       ;_   :S - единственный выбор
       ;_   :E - только непосредственное указание
       ;_   '((0 . "LINE")) - фильтр по типу примитива
;_ В переменной line - набор с 1 отрезком
(setvar "CMDECHO" 0) ;_Отключаем эхо-вывод команд
(command "_MOVE"  ;_Вызов команды перенеси
         line     ;_Выбираем отрезок в наборе line
         ""       ;_Enter подтверждаем окончание выбора
         (setq pt (cdr(assoc 10 (entget(ssname line 0))))) ;_Базовая точка - начало отрезка
         (polar  ;_Найти точку, отстоящую от
           pt    ;_ pt
           0     ;_ под углом 0 РАДИАН
           dist  ;_На расстоянии dist
           )
         )
(setvar "CMDECHO" echo)
(princ)
)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 26.11.2007, 16:29
#14
Profan


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


Так, не зря я тянул резину...
Profan вне форума  
 
Автор темы   Непрочитано 26.11.2007, 17:27
#15
AlexeySh


 
Регистрация: 26.11.2007
Сообщений: 60


Большое спасибо! Именно это я и хотел.

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А что должно быть параметрами?
Про параметры, я имел в виду вызов какой-либо команды с "параметрами", как, в данном случае, VVA расписал вызов команды MOVE.
AlexeySh вне форума  
 
Автор темы   Непрочитано 26.11.2007, 17:37
#16
AlexeySh


 
Регистрация: 26.11.2007
Сообщений: 60


VVA, скажите, пожалуйста.
Где Вы брали информацию по вызовам команд автокада с параметрами? В хелпе автокада английской версии?
AlexeySh вне форума  
 
Непрочитано 26.11.2007, 17:55
#17
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Параметры при вызове команды из лиспа аналогичны параметрам при запуке из командной строки. А вот опции команды лучше указывать как в английской с подчеркиванием _.
Типа
Код:
[Выделить все]
(command "_-Layer"
         "_M"              ;_ _Make Создать
         "Мой новый слой"
         "_C"              ;_ _Color Цвет
         1
         ""
         ""
         )
Кстати учти, что многие команды имеют режим диалога и командной строки.
Сравни
_Layer
и
_-Layer
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 27.11.2007, 00:08
#18
AlexeySh


 
Регистрация: 26.11.2007
Сообщений: 60


Вот как раз параметров при запуске из командной строки я и не могу найти.
Придется, наверное, английский автокад ставить, чтобы хелп в нем смотреть.
AlexeySh вне форума  
 
Непрочитано 27.11.2007, 09:28
#19
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Что ты вкладываешь в термин параметры?
Я - тип ввода (опция, точка, угол) и их последовательность.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 27.11.2007, 09:38
#20
Кулик Алексей aka kpblc
Moderator

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


Не удержусь: а я - передаваемые в функцию значения
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.11.2007, 10:44
#21
Елпанов Евгений

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


Наверное, имеет смысл договориться о применении терминов...

Аргумент функции
Цитата:
Аргумент функции — независимая переменная, от значений которой зависят значения функции.
лисп
Функциональное программирование
Елпанов Евгений вне форума  
 
Непрочитано 27.11.2007, 11:20
#22
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Тогда уж надо было цитировать

а не понятие аргумента в математике.

Хотя что имел ввиду автор вопроса - непонятно. Возможно, что величина смещения должна быть не зашита в программу. Конечно, VVA сделал просто для примера с постоянной (setq dist 100). А вот если переделать "квази-команду" C:L_MOVE (ей нельзя передать аргументы) в "настоящую" функцию, то можно сделать величину смещения аргументом.

Код:
[Выделить все]
 
(defun L_MOVE (dist / echo line)
....
)
Это, конечно, не для Евгения и не для VVA
ShaggyDoc вне форума  
 
Непрочитано 27.11.2007, 11:22
#23
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Я так понял, что пока непонятно как повторить команду Автокада с помощью command
передаваемые в функцию значения пока непонятней еще больше и это следующий шаг.
Давай считать параметром команды все то, что мы ей отвечаем, когда работаем ручками. Это могут быть опции, указание точки, расстояния, угла и т.п.
- Опция в команде передается ввиде строки, желательно английская с _
- точка ввиде списка lisp'a (10 20 30)
- для ожидания ввода пользователя служит символ pause
- нажатие клавиши Enter задается ""
Пример 1
Создадим слой с помощью _-layer
Листинг командной строки (цветной - коментарии)

Цитата:
Команда: _-layer (line 1)
Текущий слой: "0"
Задайте опцию [?/Создать/Установить/Новый/Вкл/Откл/Цвет/Тип линий/вЕс
линий/пеЧать/Заморозить/Разморозить/Блок/рАзблок/Конфигурация]: _M (опция Создать line 2)
Введите имя нового слоя (этот слой станет текущим) <0>: Новый слой (line 3)
Задайте опцию [?/Создать/Установить/Новый/Вкл/Откл/Цвет/Тип линий/вЕс
линий/пеЧать/Заморозить/Разморозить/Блок/рАзблок/Конфигурация]: _C (опция Цвет line 4)
Новый цвет [изПалитры/Альбом] <7 (белый)>: 5 (line 5)
Список имен слоев для присвоения цвета 5 (синий) <Новый слой>: (нажали Enter 1 line 6)
Задайте опцию [?/Создать/Установить/Новый/Вкл/Откл/Цвет/Тип линий/вЕс
линий/пеЧать/Заморозить/Разморозить/Блок/рАзблок/Конфигурация]: (нажали Enter 2 line 7)
Теперь все этио на лиспе
Код:
[Выделить все]
(command "_-Layer"        ;_ (line 1)
         "_M"             ;_ (опция Создать line 2)
         "Новый слой"     ;_ (line 3)
         "_C"             ;_ (опция Цвет line 4)
          5               ;_ (line 5)
         ""               ;_ (нажали Enter 1 line 6)
         ""               ;_ (нажали Enter 2 line 7)
         )
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 27.11.2007, 11:31
#24
Profan


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


Да наверняка AlexeySh под параметрами имеет в виду опции команд.
Цитата:
но я изучаю LISP второй день
Цитата:
где можно взять список команд автокада с параметрами
Profan вне форума  
 
Автор темы   Непрочитано 27.11.2007, 12:39
#25
AlexeySh


 
Регистрация: 26.11.2007
Сообщений: 60


Под параметрами я имел ввиду передаваемые в функцию значения, как во многих (если не во всех) языках программирования.
И в автокаде , я как понял, это "все то, что мы ей отвечаем, когда работаем ручками". Правильно?

Для чего все это мне было нужно.
Была задача: "Существует фигура на плоскости, состоящая из отрезков. Известна ее необходимая площадь, и известна грань (отрезок), которую можно двигать для получения необходимой площади."
Я вычислял площадь указываемой фигуры и сдвигал отрезок в ту или в другую сторону. И так, пока нужная площадь не получится.
..........
Остался у меня вопрос, я указываю область, указываю отрезок. А получить как направление сдвига? Может по перпендикуляру от точки к отрезку?

Если есть желание, выложу, что получилось чуть попозже.
AlexeySh вне форума  
 
Непрочитано 27.11.2007, 12:47
#26
Profan


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


Ну, тогда можно использовать команду "_OFFSET" ("ПОДОБИЕ").
Profan вне форума  
 
Непрочитано 27.11.2007, 13:47
#27
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
Сообщение от AlexeySh Посмотреть сообщение
Под параметрами я имел ввиду передаваемые в функцию значения, как во многих (если не во всех) языках программирования.
И в автокаде , я как понял, это "все то, что мы ей отвечаем, когда работаем ручками". Правильно?
Нет, неправильно.

"все то, что мы ей отвечаем, когда работаем ручками" - это относится к функции AutoLISP command или vl-cmdf, которой передается имя команды AutoCAD, а затем, в качестве аргументов, всё, что эта команда ожидает.

То есть, если с помощью функции command вызвать команду Автокада MOVE то она будет запрашивать выбор объектов (до пустого ввода), базовую точку и точку, куда надо переместить.

Если же написать на LISP функцию, например, перемещения, то ей в аргументах можно передать то, что надо программисту. Можно и набор примитивов, и базовую точку, и смещение. А конечную точку - высчитать.
ShaggyDoc вне форума  
 
Непрочитано 27.11.2007, 14:04
#28
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,268


2 All
Заглянул я по ссылке http://ru.wikipedia.org/wiki/Lisp Елпанова Евгения, а там написано: Лисп считается вторым после Фортрана старейшим высокоуровневым языком программирования. .
А разве Алгол не старше Фортрана?
Pilot вне форума  
 
Автор темы   Непрочитано 27.11.2007, 14:11
#29
AlexeySh


 
Регистрация: 26.11.2007
Сообщений: 60


ShaggyDoc
Согласен.
AlexeySh вне форума  
 
Непрочитано 27.11.2007, 14:16
#30
Хмурый


 
Регистрация: 29.10.2004
СПб
Сообщений: 16,337


Off Top

Фортран созан в период 54-57 годы http://ru.wikipedia.org/wiki/Фортран
Алгол разработан в 58-60 годы http://ru.wikipedia.org/wiki/Алгол
Хмурый вне форума  
 
Непрочитано 27.11.2007, 14:35
#31
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,268


А почему-же, когда говорят об алгоритмических языках, в первую очередь называют Алгол? Вспоминается даже фраза: "Алгол - прадедушка всех алгоритмических языков".
Тогда: или Фортран - не алгоритмический язык, или он появился после Алгола.
Или: вышеуказанное изречение - штамп не слишком сведущих в истории программирования людей.
Pilot вне форума  
 
Непрочитано 27.11.2007, 14:48
#32
Хмурый


 
Регистрация: 29.10.2004
СПб
Сообщений: 16,337


Это можно посмотреть в ссылке по Алголу, которуяю я привел. Кажется, в ней есть ответ. Вот он
Цитата:
Алгол был популярен в Европе, в том числе в СССР, в то время как сравнимый с ним язык Фортран был распространен в США и Канаде
У нас был самый могучий язык- АлМИР и ещё машинные коды для "Наири"

ЯАП- язык авто-программирования.

"Послать число 12 в ячейку 1420
Послать число 16 в ячейку 1421
Сложить (СП- сложение плавающее) содержимое ячейки 1420 с содержимым ячейки 1421
Результат записать в ячейку 1422"

Последний раз редактировалось Хмурый, 27.11.2007 в 14:54.
Хмурый вне форума  
 
Непрочитано 27.11.2007, 15:01
#33
Profan


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


С рельсов сошли...
Profan вне форума  
 
Непрочитано 27.11.2007, 15:02
#34
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,268


В институте еще изучали Алгол. А потом лабу надо было делать, и вдруг выясняется: ЭВМ для лабы Алгола не знает, а знает Алгамс. Почти то же самое с некоторыми изменениями синтаксиса. Но главное отличие - код должен быть прописными буквами. Так или иначе, но коды для лабы всем пришлось переписывать.
Pilot вне форума  
 
Непрочитано 27.11.2007, 15:07
#35
Хмурый


 
Регистрация: 29.10.2004
СПб
Сообщений: 16,337


С катушек съехали...
Хмурый вне форума  
 
Непрочитано 27.11.2007, 15:08
#36
Кулик Алексей aka kpblc
Moderator

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


Ау, народ, вы куда??
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 27.11.2007, 15:13
#37
AlexeySh


 
Регистрация: 26.11.2007
Сообщений: 60


Остался у меня вопрос, я указываю область, указываю отрезок.
А получить как направление сдвига? Может по перпендикуляру от точки к отрезку?
AlexeySh вне форума  
 
Непрочитано 27.11.2007, 15:36
#38
Profan


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


См. сообщение 26. Но если вы сдвинете отрезок, область, для которой надо определить площадь, разорвется?
Profan вне форума  
 
Автор темы   Непрочитано 27.11.2007, 15:46
#39
AlexeySh


 
Регистрация: 26.11.2007
Сообщений: 60


Profan, Извиняюсь, у меня сейчас автокада рядом нет..

Область не разрывается, в конце концов пользователь может удлинить концы отрезков ....
А эта задача уже сделана и работает... Вот только направление приходится руками задавать (параметр для команды MOVE - угол сдвига). Было бы красиво, чтобы само считалось...
AlexeySh вне форума  
 
Непрочитано 27.11.2007, 20:34
#40
Profan


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


Вот еще простенький пример с командой "ПОДОБИЕ" ("_OFFSET"). Отрезок перемещается параллельно самому себе. Как у вас там область образуется, я не понял.
На русском языке:
Код:
[Выделить все]
 
(defun C:О_ПОДОБИЕ ( / echo ln dst)
(setq echo (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(setq ln (entsel "\n Выберите отрезок: "))
(if ln
    (progn
    (setq dst (getreal "\n Величина смещения отрезка: "))
    (princ "\n Укажите точку, определяющую сторону смещения: ")
    (command "ПОДОБИЕ" "у" "да" dst (car ln) pause "")
    )
)
(setvar "CMDECHO" echo)
(princ)
)
На английском языке:
Код:
[Выделить все]
 
(defun C:L_offset ( / echo ln dst)
(setq echo (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(setq ln (entsel "\n Выберите отрезок: "))
(if ln
    (progn
    (setq dst (getreal "\n Величина смещения отрезка: "))
    (princ "\n Укажите точку, определяющую сторону смещения: ")
    (command "_OFFSET" "_e" "_yes" dst (car ln) pause "")
    )
)
(setvar "CMDECHO" echo)
(princ)
)
Profan вне форума  
 
Непрочитано 27.11.2007, 22:09
#41
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


>AlexeySh
Только если начинаете изучать LISP, то учитесь делать сразу правильно и надежно - переучиться будет трудно. Приводимые примеры расценивайте как прототипы "промышленных". В них, для простоты понимания, Profan опустил ряд важных моментов:

1. Что будет, если будет выбран не отрезок?
2. Что будет, если будет нажата ESC?
3. А если "реал" неправильно введут?
4. А если пустой ввод сделают?
5. А если будет включена постоянная привязка?
6. А если точку смещения как-то не эдак зададут? Например, на продолжении отрезка.

Незачем внутрь команды в данном случае вставлять pause (источник ошибок пользователя). Надо до функции command запросить точку, проверить правильность её ввода, и, возможно, совместить указание точки с запросом величины смещения.
Да и вообще command надо заменить на vl-cmdf и обернуть ловушкой ошибок. Функция command устарела, она всегда возвращает NIL, то есть не дает возможность оценить выполнилась она или нет.

Чтобы не придумывать ещё украинских и грузинских вариантов, имена команд и опций надо всегда писать в английском варианте независимо от локализации AutoCAD с префиксом _. А уж текстовые сообщения - на любой мове.
ShaggyDoc вне форума  
 
Непрочитано 27.11.2007, 22:37
#42
Кулик Алексей aka kpblc
Moderator

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


ShaggyDoc, хочу дополнить: если лисп применять в AutoCAD LT + LT Extender или, например, в BricsCAD'e, то более чем возможен вариант возврата vl-cmdf значения nil независимо от результата выполнения. Учитывая возможный зоопарк софта, я б не стал завязываться на возвращаемое значение, а при первой возможности вообще отказывался бы от командных методов. Независимо от того, как они вызываются.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.11.2007, 06:52
#43
Profan


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


ShaggyDoc, какого черта. Вы обрушиваете на человека массу информации о проблемах, до которых он еще не вырос. Вы предлагаете ему выполнить пятилетку в 2 дня? Шаг за шагом - и все образуется. Шишки тоже бывают полезны.
Profan вне форума  
 
Непрочитано 28.11.2007, 08:02
#44
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
Сообщение от Profan Посмотреть сообщение
ShaggyDoc, какого черта. Вы обрушиваете на человека массу информации о проблемах, до которых он еще не вырос. Вы предлагаете ему выполнить пятилетку в 2 дня? Шаг за шагом - и все образуется. Шишки тоже бывают полезны.
Шаг за шагом можно уйти в другую сторону, откуда уже трудно вернуться. Шишки полезны и свои будут непременно. Но чужие ошибки лучше не повторять. Мы когда-то осваивали методом тыка - документации не было, опыта не было. Но сейчас-то можно сразу правильно учиться.

"Масса информации" - это только намёк на проблемы. Чтобы быть готовым к ним. Вот если бы я рабочий код привел, то в нем действительно разбираться было бы трудно начинающему.
ShaggyDoc вне форума  
 
Непрочитано 28.11.2007, 09:27
#45
Profan


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


Для ShaggyDoc.
Конечно, трудно было бы. И я сознательно все упростил. Почему? Да потому, что пока у AlexeySh частная задача: как переместить отрезок параллельно самому себе. Программа моя работает и "если" тут не причем. Esc ни на что в сущности не повлияет. Привязки при выполнении команды "_OFFSET" ("ПОДОБИЕ") не работают. Не попал на объект? Не страшно. Вот если бы я не ввел функцию (if), тогда другое дело. Хотя, конечно, надо было записать так:
Код:
[Выделить все]
 
(if ln
   (progn
   (setq dst (getreal "\n Величина смещения отрезка: "))
   (princ "\n Укажите точку, определяющую сторону смещения: ")
   (command "_OFFSET" "_e" "_yes" dst (car ln) pause "")
   )
   (princ "\n Объект не выбран.")
)
Да все это придирки. Я помню, когда заработала моя первая примитивная программа - как я был счастлив. Книжечка у меня была, по AutoLisp 10. Именно по ней я изучал AutoLisp шаг за шагом. Уйти в сторону в данном случае просто невозможно. А вы предлагаете, как представляется, новичку сразу отказаться от командных методов и использовать в своих разработках объектные методы и ActiveX. Так что ли? Так я вам скажу, что если бы у меня 16 лет назад была бы не та простенькая, но достаточно подробная, с примерами, книжечка, а книга Н.Н. Полещука размером и весом с кирпич и в которой большая часть посвящена описанию VLisp, объектным методам и ActiveX, я бы, наверное, и не стал бы программировать. А так у меня до сих пор сохранилось благоговейное отношений к AutoLisp и, соответственно, к AutoCAD.
В отношении (pause). Наоборот, в данном случае, применение ее оправдано, потому что никаких ошибок в указании направления смещения быть не может, а привязки, как я уже написал, в этот момент не действуют.
Да и вообще, дело здесь в другом.
Цитата:
Для чего все это мне было нужно.
Была задача: "Существует фигура на плоскости, состоящая из отрезков. Известна ее необходимая площадь, и известна грань (отрезок), которую можно двигать для получения необходимой площади."
Я вычислял площадь указываемой фигуры и сдвигал отрезок в ту или в другую сторону. И так, пока нужная площадь не получится.
..........
Остался у меня вопрос, я указываю область, указываю отрезок. А получить как направление сдвига? Может по перпендикуляру от точки к отрезку?
Направление сдвига команда "_OFFSET" дает однозначно. Но вот общую задачу я не понимаю. Ясно, что определить площадь области, ограниченной отрезками, можно. Допустим, создав контур. Но как это делает AlexeySh? Он не написал. Но если один из отрезков сдвинуть, то замкнутого контура уже не будет. Опять же он пишет, что у него все в порядке. Как? Такие вопросы вы ему не задаете, у вас задача раскритиковать другого человека, пытающегося понять, чего хочет AlexeySh, пытающегося ему помочь. Зря.
Profan вне форума  
 
Непрочитано 28.11.2007, 09:35
#46
Profan


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


Для AlexeySh.
Цитата:
Придется, наверное, английский автокад ставить, чтобы хелп в нем смотреть
.
Необязательно устанавливать английский AutoCAD, достаточно иметь файл acad_acr.chm из его Help.
Profan вне форума  
 
Автор темы   Непрочитано 28.11.2007, 23:21
#47
AlexeySh


 
Регистрация: 26.11.2007
Сообщений: 60


Вот что у меня получилось.
Сделано для частной задачи. Область не разрывается при перемещении отрезка.

Код:
[Выделить все]
(defun c:autoarea (/		 desired_area  precision
		   inspointext	 area_real     step
		   Napravlen	 my_angle
		  )
  (setq desired_area (getreal "\Введите площадь: "))
  (setq precision (getreal "\Введите точность <0.001>: "))
  (princ precision)
(if (= precision nil) (setq precision 0.001)) 	
  (princ precision)
  (setq inspointext (getpoint "\Введите точку в области: "))
  (setq My_Line (ssget "_:L:S:E" '((0 . "LINE"))))
  (setq my_angle (getreal "\Введите угол направления перемещения: "))
  (setq my_grad_angle (* -1 pi (/ my_angle 180.0)))

  (setq step -10.0) ;_Расстояние перемещения

  (command "_cmdecho" "0" "")
  (command "_boundary" "_a" "_o" "_r" "" inspointext "")
  (command "_area" "_e" "_l")
  (setq area_real (getvar "area"))
  (command "_erase" "_l" "")

  (if (> desired_area area_real)
    (setq Napravlen 1)
    (setq Napravlen -1)
  );end if

  (while (< precision (abs (- area_real desired_area)))

    (Line_Move)

    (command "_boundary" "_a" "_o" "_r" "" inspointext "")
    (command "_area" "_e" "_l")
    (setq area_real (getvar "area"))
    (command "_erase" "_l" "")

    (if	(and (> desired_area area_real) (= Napravlen -1))
      (progn
	(setq Napravlen 1)
	(setq step (/ step 2))
      )
    )

    (if	(and (< desired_area area_real) (= Napravlen 1))
      (progn
	(setq Napravlen -1)
	(setq step (/ step 2))
      )
    )
  );end_while

  (command "_cmdecho" "1" "")
  (setq new_area (rtos area_real 2 4))
  (princ new_area)
);defun c:autoarea

(defun Line_Move (/ echo dist)
  (setq echo (getvar "CMDECHO"))
  (command "_MOVE"
	   My_Line
	   inspointext (polar inspointext my_grad_angle (* Napravlen step))
  )
  (setvar "CMDECHO" echo)
)
Какие проблемы я здесь не решил из-за нехватки времени, и которые хорошо бы сделать:
1) Проверку на выбранный объект, ввод данных пользователя
2) Проверку на включенную привязку
3) Расчет угла направления перемещения (my_angle)

Да,..., нужно книжицу по AUTOLISPу покупать.
AlexeySh вне форума  
 
Непрочитано 29.11.2007, 10:14
#48
Profan


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


Не мешало бы пример контура привести здесь. И неизвестно, в каких единицах задается площадь, и вообще программа не работает.
Profan вне форума  
 
Автор темы   Непрочитано 29.11.2007, 17:29
#49
AlexeySh


 
Регистрация: 26.11.2007
Сообщений: 60


Пример: подбор площади области, созданной отрезками (напр 10000)
Вложения
Тип файла: dwg
DWG 2004
пример области.dwg (36.1 Кб, 529 просмотров)
AlexeySh вне форума  
 
Автор темы   Непрочитано 29.11.2007, 17:30
#50
AlexeySh


 
Регистрация: 26.11.2007
Сообщений: 60


Программа работает, ей уже активно пользуются... и благодарят.
AlexeySh вне форума  
 
Непрочитано 29.11.2007, 19:18
#51
Profan


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


Я так и подумал, что отрезки пересекающиеся, а не сопряженные. С сопряженными отрезками такой фокус не прошел бы.
Вот какая хрень у меня получилась:
Код:
[Выделить все]
 
Команда: autoarea
Введите площадь: 10000
Введите точность <0.001>:
nil0.001Введите точку в области:
Выберите объекты:
Введите угол направления перемещения: 90
Неизвестная команда "AUTOAREA". Для вызова справки нажмите F1.
Извлечено: 1 замкнутый контур
 
Создано: 1 область.
КОНТУР: создано объектов - 1 область
*Неверный выбор*
Требуется точка или 
Рамка/Последний/Секрамка/БОКС/Все/Линия/РМн-угол/СМн-угол/Группа
Функция отменена
Аварийное завершение команды!
Profan вне форума  
 
Автор темы   Непрочитано 29.11.2007, 22:13
#52
AlexeySh


 
Регистрация: 26.11.2007
Сообщений: 60


Я и говорил, что задача узкоспециальная, зато подгоняет фигуру любой сложности до нужной площади
AlexeySh вне форума  
 
Непрочитано 30.11.2007, 10:34
#53
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Все равно программа вылетит, если "шагая" для подбора площади ты выйдешь за границы отрезка.
Предлагаю для такого случая воспользоваться XLINE (Прямая). Вижу 2 преимущества:
1. контур всегда будет пересекаться, как бы далеко ты не шагнул
2. в 10 поле xline хранится точка, а в 11 вектор направления (то есть угол). Добавив к нему 90 градусов, получишь перпендикуляр.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 02.12.2007, 15:00
#54
AlexeySh


 
Регистрация: 26.11.2007
Сообщений: 60


VVA, Предложил пользователям этот вариант,.... не захотели.
AlexeySh вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Перемещение отрезка в LISP

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ламерские вопросы по LISP и DCL TheBuTeK LISP 7 03.07.2016 22:15
Подскажите, существуют ли практические руководства по Lisp? vn LISP 261 26.11.2015 13:27
Библиотека доступа к содержимому растров из LISP - существуе kp+ LISP 6 16.10.2007 21:45
Как вывести текст в model из приложения написанного на lisp? paradoxvaha AutoCAD 3 16.04.2007 03:54
загрузка DOS прог через LISP Gaa LISP 15 12.08.2005 19:19