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

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

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

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

Извините, если это банально просто, но я изучаю LISP второй день, а результат нужен уже...
Вообщем, нужно передвинуть выбранный отрезок на какое-то указанное расстояние (кол-во единиц) в сторону от точки (можно тоже указанной на экране или с указанными координатами) параллельно самому себе.
Заранее спасибо.
Просмотров: 9121
 
Непрочитано 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,835


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,991
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Все равно программа вылетит, если "шагая" для подбора площади ты выйдешь за границы отрезка.
Предлагаю для такого случая воспользоваться 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