Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Lisp
Перезагрузить страницу Команда ссылка есть ли она в Lisp
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
kminas kminas вне форума
Member
 
Сообщений: 140
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 26.10.2005
По умолчанию Команда ссылка есть ли она в Lisp - 22.11.2006, 22:50

Я начинаю учится языку AutoLisp. Раньше, когда еще чертили в DOSе в AutoCADe, а может быть в надстройке была команда "ссылка", с помощью которой можно было расположить объект на определенном расстоянии, относительно привязок (пересечения, конечной точки или центра круга и т.д.). Кто-нибудь знает об этой команде. И, если, можно, как это может решается на AutoLisp-е?
Ответить с цитированием
  (#2 (permalink)) Старый
ment ment вне форума
Member
 
Сообщений: 28
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 25.03.2007
По умолчанию 26.03.2007, 22:40

Во времена доса я был очень маленьким
Можно поподробнее, какэто расположить объект относительно привязок?.
Какая именно цель задачи?
Ответить с цитированием
  (#3 (permalink)) Старый
kminas kminas вне форума
Member
 
Сообщений: 140
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 26.10.2005
По умолчанию 27.03.2007, 00:23

Есть, например, пересечение. А вставляемый объект должен располагаться на 2000мм вправо по оси Х и на 4000мм вверх по оси У. Например от колнны. Так вот там была такая команда. Кликаешь на пересечение или конечную точку и задаешь указанные размеры.
Ответить с цитированием
  (#4 (permalink)) Старый
VH VH вне форума
Member
 
Сообщений: 781
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 10 сообщениях
Регистрация: 29.06.2006
По умолчанию 27.03.2007, 06:33

Сейчас в AutoCAD есть объектная привязка _FROM (СМЕщение), выполняющая необходимые Вам вычисления.
Попробуйте познакомиться с конференцией http://www.autocad.ru/cgi-bin/f1/board.cgi
Ответить с цитированием
  (#5 (permalink)) Старый
ment ment вне форума
Member
 
Сообщений: 28
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 25.03.2007
По умолчанию 27.03.2007, 20:48

Вобщем надо определить координаты точки смещенной на определенное расстояние по Х и У.
Вот впринципе сама функция

Код:
;Функция определения точки смещения от базовой точки
;Базовая точка должна лежать в аргументе
(defun deltapoint (basepoint / deltax deltay )
 (if (null
  (Setq deltax (getdist "\nСмещение по X : ")))
   (setq deltax 0.0))
 (if (null
  (Setq deltay (getdist "\nСмещение по Y : ")))
   (setq deltay 0.0))

     (list
      (+ (nth 0 basepoint) deltax)
          (+ (nth 1 basepoint) deltay))
     );(deltapoint '(100 100))

Примеры использования:

(deltapoint (getpoint))


;Вставка из буфера обмена
(defun c:clippaste ()

  (setq basepoint (getpoint "\nУкажите базовую точку : "))
  (Setq pastepoint (deltapoint basepoint))
    
  (command "_.pasteclip" pastepoint)
  (princ)
  )

;вставка блока

(defun c:deltaInsert ()

  (setq basepoint (getpoint "\nУкажите базовую точку : "))
  (Setq pastepoint (deltapoint basepoint))
    (initdia 1)
  (command "_.insert" pastepoint)
  (princ)
  )

Для команды _move

(defun c:deltamove ()

  (setq ss-get (ssget))
  (setq basepoint (getpoint "\nУкажите базовую точку : "))
  (Setq pastepoint (deltapoint basepoint))

  (command "_.Move" ss-get "" basepoint pastepoint)
  (princ)
  )
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
VH VH вне форума
Member
 
Сообщений: 781
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 10 сообщениях
Регистрация: 29.06.2006
По умолчанию 27.03.2007, 23:43

Код:
(defun deltapoint ()
  ((lambda (basepoint)
    ((lambda (delta)
      (if delta
       (mapcar '+ basepoint delta)
       basepoint))
     (getpoint "\n<Смещение>: ")))
   (getpoint "\nБазовая точка: ")))
Ответить с цитированием
  (#7 (permalink)) Старый
ment ment вне форума
Member
 
Сообщений: 28
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 25.03.2007
По умолчанию 28.03.2007, 14:48

>VH
getpoint для данной задачи не рулит. Здесь надо четко указать смещение т.е. Дельты ХY.
Код:
Вот функции для толучени дельт ерез getpoint

(setq basepoint (getpoint "\nБазовая точка : "))

(initget 128)
(setq deltax (getpoint basepoint "\nСмещение по х : "))
(if
  (= (type deltax) 'STR)
  (atof deltax)
  (setq deltax (- (nth 0 deltax) (nth 0 basepoint))));гдетоздесьянакосячил 29марта исправил
;Дальше тожесамое для Y
здесь можно указать точку на экране и возвратится только дельта. А можно ввести число с клавиатуры которое и будет дельтой.
Только надо сделать обработчик на запрет ввода нечисловых значений, тк (initget 128) разрешает ввести все что угодно и если введена не точка то возвратится строка, которая функцией atof будет переделана в 0.0.

И сама функция atof округляет дробные части до 3-4 знаков, что может привести к небольшим неточностям при построении примитивов. Вот только как могут повлиять результаты округления на полученный чертеж одному автодеску известно.
Ответить с цитированием
  (#8 (permalink)) Старый
VH VH вне форума
Member
 
Сообщений: 781
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 10 сообщениях
Регистрация: 29.06.2006
По умолчанию 28.03.2007, 20:15

>ment
Вы, вероятно, никогда не видели, как действует объектная привязка _FROM (СМЕщение)?
Ответить с цитированием
  (#9 (permalink)) Старый
ment ment вне форума
Member
 
Сообщений: 28
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 25.03.2007
По умолчанию 28.03.2007, 21:14

Цитата:
вставляемый объект должен располагаться на 2000мм вправо по оси Х и на 4000мм вверх по оси У.
>VH

Допустим Надо вставить Вправо на 20 и вверх на 10

Код:
Команда: _pasteclip Точка вставки: _from Базовая точка: (Укказал точку) <Смещение>: (Указал 20)
= объект вставился на 20 единиц в сторону в направлении курсора
Если вместо 20 указать 20,10 объект и вставится в точке с координатами (20,10)
Тоесть в команде from нет желаемого смещения, она подходит только тогда, когда известно напрвавление смещения, а также она подойдет когда надо сместить только вправо или влево или вверх или вниз.

И вообще эта панель привязок мне не нравится
Советую заменить в ней команды на примерно такие:

Код:
(Defun c:onlyCenter ()
  (setvar "osmode" 4)
  (princ)
  )

(defun c:onlyCrossing ()
  (setvar "osmode" 32)
  (princ)
  )

(defun C:allsnap ()
  (setvar "osmode" 15359)
  (princ)
  )
;ИТД
Так они будут работать не только в режиме команды
Ответить с цитированием
  (#10 (permalink)) Старый
VH VH вне форума
Member
 
Сообщений: 781
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 10 сообщениях
Регистрация: 29.06.2006
По умолчанию 29.03.2007, 05:45

Справка по AutoCAD 2005/Справочник команд/Ключевые слова для команд:
Ключевое слово СМЕЩЕНИЕ
Привязка к точке, смещенной от указанной базовой точки на заданное расстояние

Панель Объектная привязка: {кнопка "Смещение"}
Командная строка: В ответ на запрос указания точки ввести сме

Базовая точка: Указать точку, которая служит базовой
<Смещение>: Ввести смещение

На запрос AutoCAD о положении точки нужно ввести сме, а затем указать базовую точку, относительно которой задается смещение для положения следующей точки. Смещение от базовой точки можно ввести как относительную координату (выделение мое - VH.) или методом «направление-расстояние».

Замечание Этот метод указания точек невозможен при отслеживании в процессе выполнения таких команд, как ПЕРЕНЕСТИ и КОПИРОВАТЬ. Задание абсолютных координат с клавиатуры или с помощью устройства указания отменяет ввод ключевого слова СМЕЩЕНИЕ. (подчеркивание мое - VH.)

Таким образом, не "...в команде from нет желаемого смещения..." (кстати, это не команда, а режим объектной привязки), а есть невнимательность при изучении справочной документации.

Задача kminas от 26.03.2007 решается
Точка вставки: СМЕщение Базовая точка: ПЕРесечение Указать точку <Смещение>: @2000,4000
Задача ment от 28.03.2007 решается
Команда: _pasteclip Точка вставки: _from Базовая точка: Указать точку <Смещение>: @20,10
Ответить с цитированием
  (#11 (permalink)) Старый
ment ment вне форума
Member
 
Сообщений: 28
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 25.03.2007
По умолчанию 29.03.2007, 16:50

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

В любом случае проще нарисовать пару вспомогательных линий

Вобщем придумал тут нечто подобное, возможно это окажется тоже неплохим инструментом, а может и нет.

Функция запрашивающая значения смещений: при запросе надо ввести число или указать две точки - расстояние между точками и будет смещением по оси.

Код:
(defun deltapoint-dist (basepoint / deltax deltay )
(if (null
  (Setq deltax (getdist "\nСмещение по X : ")))
   (setq deltax 0.0))
(if (null
  (Setq deltay (getdist "\nСмещение по Y : ")))
   (setq deltay 0.0))

     (list
      (+ (nth 0 basepoint) deltax)
          (+ (nth 1 basepoint) deltay))
     )
Функция запрашиваючая смещение: при запросе можно ввести число или указать одну точку в этом случае значение смещения будет дельтой X или Y между базовой точкой и указанной. Более гибкая функция чем предыдущая.

Код:
(defun deltapoint-getpoint (basepoint)

(initget 128)
(setq deltax (getpoint basepoint "\nСмещение по X : "))
(if
  (= (type deltax) 'STR)
  (setq deltax(atof deltax))
  (setq deltax (- (nth 0 deltax) (nth 0 basepoint))))

(initget 128)
(setq deltay (getpoint basepoint "\nСмещение по Y : "))
(if
  (= (type deltay) 'STR)
  (setq deltay (atof deltay))
  (setq deltay (- (nth 1 deltay) (nth 1 basepoint))))
  (list
      (+ (nth 0 basepoint) deltax)
          (+ (nth 1 basepoint) deltay))
  )
Вот что с ними можно сделать:
Код:
(defun dispd ()
  (deltapoint-dist (getpoint "Базовая точка : "))
  )


(defun dispp ()
  (deltapoint-getpoint (getpoint "Базовая точка : "))
  )
пример использования.
В командах, когда они требуют ввести какое либо значение, можно ввести лисп-выражение, желательно чтобы оно возвращало нужное значение.
например для команды _circle подойдут функции (dispd) (dispp) в обоих запросах

Код:
Команда: _circle Центр круга или [3Т/2Т/ККР (кас кас радиус)]: (dispd)
Базовая точка :
Смещение по X :  Вторая точка:
Смещение по Y :  Вторая точка: (1721.92 933.783)

Радиус круга или [Диаметр] <313.2778>: (dispp)
Базовая точка :
Смещение по X :
Смещение по Y : (1412.21 706.365)
также эти функции можно вводить в любых командах Автокада, при запросе точек.

самый лучший вариант это прописать функции в макросах панелей инструментов, так ими будет легче пользоваться.
В атокад 2006-2007 появилось визуальное средство для создания панелей и меню(команда CUI), несколько лучшее чем ручное расписывание MNU. В 2007 лучше чем в 2006.
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ссылка на объект Patriot_123 .NET 2 15.12.2011 16:31
Слово ссылка. С.Вик. Любые вопросы от новичков 8 15.10.2011 19:34
xml - swf -ссылка goodwill XML & WML 0 23.06.2011 13:45
Есть ли команда автоматической сортировки по какому-то признаку f1book serg_k C++ Builder 4 27.11.2006 18:12
Ссылка на указатель MTony С/С++ 6 05.07.2006 10:31
Полезная ссылка imported_Robert Prolog 2 22.05.2006 14:30
Ссылка на метод в С++ _newbie_ С/С++ 5 25.01.2006 14:54
Web-ссылка на форме VB6 imported_Arman Visual Basic 12 15.01.2006 12:36
Есть ли в RichEdit команда перевода страницы Anonymous C++ Builder 0 01.11.2002 10:12



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов