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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Ответ
Поиск в этой теме
Непрочитано 20.07.2008, 20:12
Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)
Red Nova
 
ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Торонто
Регистрация: 23.10.2007
Сообщений: 1,980

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (Visual foxpro) программку типа суммирования столбцов списал у соседа (это уже в университете).
Не смотря на эте намерен научится писать программы для Автокада на лиспе, скачал книгу Хювенена, несколько примеров создания программ, но после получасового “смотрения” таких книг мое мышление явно притормаживает.
Решил пойти другим путем.
Нашел самый короткий лисп из моей коллекции, и прошу программистов с этого форума пошагово объяснить какой символ что означает. Надеюсь на вашу помощь.


Код:
[Выделить все]
(defun c:make-blocks-explodeable (/ adoc)
  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (vlax-for blk_def (vla-get-blocks adoc)
    (if (and (equal (vla-get-isxref blk_def) :vlax-false)
             (equal (vla-get-islayout blk_def) :vlax-false)
             ) ;_ end of and
      (vl-catch-all-apply '(lambda () (vla-put-explodable blk_def :vlax-true)))
      ) ;_ end of if
    ) ;_ end of vlax-for
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
_____________________________________________________________________________________________________________

Прошло много лет и топик теперь представляет из себя площадку для обучения азов программирования для многих начинающих.
Так что начинающие лиспогрызы приветствуются .
__________________
Блог

Последний раз редактировалось Red Nova, 12.07.2017 в 05:43.
Просмотров: 1973296
 
Непрочитано 07.09.2011, 13:49
#1581
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Это делаеться для того, чтобы, как раз НЕ затереть возможно существующие переменную var1. Подобный вывод переменных есть во всех диалектих лиспа (и не только) - с разным синаксисом - это так называемые локальные переменные. А функция для того и объявляется чтоб она осталась в памяти - если она больше не нужна - то не надо ее и объявлять (для многоразового, но конечного числа вызывов есть lambda).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 07.09.2011, 13:53
#1582
baaba

архитектор
 
Регистрация: 07.07.2007
Москва
Сообщений: 644
<phrase 1= Отправить сообщение для baaba с помощью Skype™


Цитата:
Сообщение от Дима_ Посмотреть сообщение
А функция для того и объявляется чтоб она осталась в памяти - если она больше не нужна - то не надо ее и объявлять (для многоразового, но конечного числа вызывов есть lambda).
Значит с функциями злоупотреблять не надо?
А можно как то "прибить" ставшие ненужными функции?
baaba вне форума  
 
Непрочитано 07.09.2011, 14:06
#1583
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


"Прибить" можно - (setq имя_функции nil), но делать так не нужно - если функция не будет нужна - не надо ее объявлять в глобальном пространстве имен (ее можно объявить локально внутри другой функции) - но повторю еще раз - в лиспе(ах - тем паче что ты про Common Lisp "заикался") для этого есть ЛЯМБДА - а про место переменных в лиспе я вобще лучше помолчу - чтоб никого не расстраивать.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 07.09.2011, 15:36
#1584
baaba

архитектор
 
Регистрация: 07.07.2007
Москва
Сообщений: 644
<phrase 1= Отправить сообщение для baaba с помощью Skype™


Цитата:
Сообщение от Дима_ Посмотреть сообщение
ее можно объявить локально внутри другой функции
Функция внути функции .. мм, так разве делают? А что вообще почитать про Автолисп порекомендуешь?
Цитата:
Сообщение от Дима_ Посмотреть сообщение
для этого есть ЛЯМБДА - а про место переменных в лиспе я вобще лучше помолчу - чтоб никого не расстраивать.
Да, но код должен быть "читаем" (в том числе для многократного повторного использования), не должно быть "магических чисел", в ANSI C, к примеру, для этого есть константы. Я поневоле сравниваю с Си, и Коммон Лиспом, так как про них параллельно читаю. И потом в "Сапр на базе Автокад" даётся целая библиотека функций. Что эти функции то же запрятаны в какую-то одну функцию? (да, я книгу читал фрагментарно).
baaba вне форума  
 
Непрочитано 07.09.2011, 15:54
#1585
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от baaba Посмотреть сообщение
Я поневоле сравниваю с Си, и Коммон Лиспом, так как про них параллельно читаю.
Бросьте это дело немедленно - изучайте что-то одно и когда ХОРОШО будете разбираться, возьмитесь за другое. Это две абсолютно разные прагмиды - функциональная и императивная, статическая и динамическая. Понятия "читаемости" в Си и Лиспе радикально противоположны. Поймите правильно - у Вас сейчас "на лицо" полная каша в голове - многие хорошо знающие одно из "этих двух" другое понять не могут (там подходы реально совсем разные), а Вы хотите сразу оба "паралельно".
Что почитать по автолисп - я, честно говоря, сам толком кроме справочника autocad'а ничего не читал, но "Сапр на базе автокад" - это вроде как классика (хотя меня она так-же стороной обошла) - а рекомендовать литературу под другие диалекты не буду - т.к. они полезны для понятия принципов лиспа, но автолисп это такой "недолисп" который не имеет некоторых БАЗОВЫХ вещей современных функциональных диалектов.
p.s. своим личным "идеалом языков" считаю Scheme.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 07.09.2011, 15:59
#1586
baaba

архитектор
 
Регистрация: 07.07.2007
Москва
Сообщений: 644
<phrase 1= Отправить сообщение для baaba с помощью Skype™


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Это две абсолютно разные прагмиды - функциональная и императивная, статическая и динамическая.
То есть Лисп - императивный, динамический, я правильно понимаю?
Совет понял - думаю сконцентрироваться на Автолисп, т. к. он ближе к работе.
baaba вне форума  
 
Непрочитано 07.09.2011, 16:00
#1587
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от baaba Посмотреть сообщение
Функция внути функции .. мм, так разве делают?
Так делали еще в турбо паскале...
gomer вне форума  
 
Непрочитано 07.09.2011, 16:04
#1588
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от baaba Посмотреть сообщение
То есть Лисп - императивный, динамический, я правильно понимаю?
Нет - это я увлекся и написал в "нелогичном" порядке - лисп функциональный, динамический. Про другие "показатели" лучше сюда, хоть автолиспа там и нет (не вздумайте делать выводы о Автолисп из Комонлиспа).
Цитата:
Так делали еще в турбо паскале...
Более того даже в ассемблере есть "синтетический сахар" для объявления имен действующих (распознаваемых компилятором) в пределах одного (первого вышестоящего) имени (физического адреса). Там к ним правда конечно можно обратиться (все-таки это ассемблер), но вначале "четко" объявив первичный адрес.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 07.09.2011 в 16:27.
Дима_ вне форума  
 
Непрочитано 07.09.2011, 21:46
#1589
baaba

архитектор
 
Регистрация: 07.07.2007
Москва
Сообщений: 644
<phrase 1= Отправить сообщение для baaba с помощью Skype™


Подскажите пожалуйста простой способ читать данные автолиспом из *.xls. Сейчас пользуюсь *.csv, но не очень удобно (спецификации то всё равно в Excell). Пока у меня примерно так сделано:
Код:
[Выделить все]
 
(setq f (open (getfiled "Select a spreadsheet file" "c:/tmp/" "csv;xls" 8) "r"))
(setq dataline (read-line f))
(close f)
Может быть есть готовая простенькая функция для высасывания данных из excell так же как и из *.csv (только что бы можно было выбирать закладку)?

Последний раз редактировалось baaba, 07.09.2011 в 22:17.
baaba вне форума  
 
Непрочитано 07.09.2011, 23:51
#1590
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от baaba Посмотреть сообщение
Подскажите пожалуйста простой способ читать данные автолиспом из *.xls. Сейчас пользуюсь *.csv, но не очень удобно (спецификации то всё равно в Excell). Пока у меня примерно так сделано:
есть и много в параллельных ветках и у Полещука пример есть... "Как у вас" не пройдет с экселевскими таблицами для них нужно иметь установленный эксель и создавать COM-связку (см. предыдущее предложение)
gomer вне форума  
 
Непрочитано 07.09.2011, 23:59
#1591
Лиспер


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


Offtop: Так и хочется отправиться к http://autolisp.ru/2011/06/08/functi...bility-region/
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 08.09.2011, 10:48
#1592
VVA

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


Цитата:
Сообщение от baaba Посмотреть сообщение
Может быть есть готовая простенькая функция для высасывания данных из excell
Есть и не одна
Построение чертежа по данным Excel
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 08.09.2011, 10:53
#1593
Ubivec81

проектирование железных дорог
 
Регистрация: 12.04.2010
Самара
Сообщений: 60
<phrase 1=


А подскажите где найти расшифровку ключей любого из примитивов?
Ubivec81 вне форума  
 
Непрочитано 08.09.2011, 11:52
#1594
Oliver_88

"ценный кадр"
 
Регистрация: 02.12.2010
Сообщений: 115
<phrase 1=


Цитата:
Сообщение от Ubivec81
А подскажите где найти расшифровку ключей любого из примитивов?
http://usa.autodesk.com/adsk/servlet...&siteID=123112
Oliver_88 вне форума  
 
Непрочитано 08.09.2011, 12:09
#1595
Ubivec81

проектирование железных дорог
 
Регистрация: 12.04.2010
Самара
Сообщений: 60
<phrase 1=


Цитата:
Сообщение от Oliver_88 Посмотреть сообщение
не получается поглядеть там! может у кого есть своя для 2009 года
Ubivec81 вне форума  
 
Непрочитано 08.09.2011, 12:54
#1596
VVA

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


Поиском поищи файл на C: acad_dxf.chm Для 2009 должен лежать в C:\Program Files\AutoCAD 2009\Help\acad_dxf.chm
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 08.09.2011, 13:18 Ребята помогите с кодом мне нужно добавить в таблицу внутренний угол, а то чёта неполучается, ибо в програмировании слабоват
#1597
aleksandr1981


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


В коде всё работает но нехватает внутреннего угла. Запуск кода geo_table

Код:
[Выделить все]
 (vl-load-com)


(defun *error* (msg)
  (princ)
)



(defun c:geo_table ()
   (initget 1 "Полилиния Точки")
   (setq x (getkword "\nПостроить ведомость по [Полилиния/Точки]: ")) 
   (if (= x "Полилиния") (ExportInExcel) (geo_point_table)) 
);_end defun



(defun geo-create-object (AppString)  
  (vlax-create-object AppString)
);_end defun






(defun geo_get_distance (pnt1 pnt2) 
   (setq pnt1 (list (car pnt1) (cadr pnt1)))
   (setq pnt2 (list (car pnt2) (cadr pnt2)))
   (distance pnt1 pnt2) 
);_end defun


(defun geo_get_angle (pnt1 pnt2) 
   (setq pnt1 (list (car pnt1) (cadr pnt1)))
   (setq pnt2 (list (car pnt2) (cadr pnt2)))
   (angle pnt1 pnt2) 
);_end defun






(defun geo-add-text (TextString InsertionPoint Height Alignment Rotation / obj)
  (if (null Alignment) (setq Alignment acAlignmentLeft))
  (setq obj (vla-addtext 
                (vla-get-modelspace (vla-get-activedocument(vlax-get-acad-object))) TextString 
    (if (or (= Alignment acAlignmentAligned)  
            (= Alignment acAlignmentFit))          
        (vlax-3d-point (car InsertionPoint)) 
        (vlax-3d-point InsertionPoint)
     ) Height))
  (cond
    ((= Alignment acAlignmentLeft) (vla-put-rotation obj Rotation))
    ((or (= Alignment acAlignmentAligned)
         (= Alignment acAlignmentFit))
     (vla-put-alignment obj Alignment)
     (vla-put-textalignmentpoint obj (vlax-3d-point (cadr InsertionPoint)))
    )
    (T
      (vla-put-alignment obj Alignment)
      (vla-put-textalignmentpoint obj (vlax-3d-point InsertionPoint))
      (vla-put-rotation obj Rotation)
    )
    (vla-update obj)
  );_end cond
      
);_end defun





(defun geo-add-line (StartPoint EndPoint Lineweight / obj)
  (setq obj (vla-addline 
                (vla-get-modelspace (vla-get-activedocument(vlax-get-acad-object))) 
            (vlax-3d-point StartPoint) (vlax-3d-point EndPoint)))

  (cond
    ((vlax-write-enabled-p obj)
      (if Lineweight (vla-put-lineweight obj Lineweight)) 
      (vla-update obj)
  ))         
);_end defun





(defun list-massoc (key alist)
  (mapcar 'cdr (vl-remove-if-not (function (lambda (x) (= key (car x)))) alist))
) 



(defun pline-list-vertex (ent / list_vertex tmp_ent type_ent)
    (setq tmp_ent  ent
          ent      (entget ent)
          type_ent (cdr (assoc 0 ent))
    ) ;_ end of setq
    (cond
        ((= "LWPOLYLINE" type_ent)
         (list (list-massoc 10 ent) (= 1 (logand 1 (cdr (assoc 70 ent)))))
        )
        ((= "POLYLINE" type_ent)
         (reverse
             (cons (= 1 (logand 1 (cdr (assoc 70 ent))))
                   (while (and (setq tmp_ent (entnext tmp_ent))
                               (/= (cdr (assoc 0 (setq ent (entget tmp_ent))))
                                   "SEQEND"
                               ) ;_ end of =
                          ) ;_ end of and
                       (setq list_vertex (cons (cdr (assoc 10 ent)) list_vertex))
                   ) ;_ end of while
             ) ;_ end of cons
         ) ;_ end of reverse
        )
        ((= "LINE" type_ent)
         (list (cons (cdr (assoc 10 ent)) (cons (cdr (assoc 11 ent)) nil)) nil)
        )
        (t nil)
    ) ;_ end of cond
) ;_ end of defun



(defun ExportInExcel ()

    (setq ent (car (entsel "\nУкажите полилинию: "))) 
    (setq lst (car (pline-list-vertex ent)))
    (setq point_count (length lst))
    (setq point_number 0)
    
    
    ;(vl-load-com)
    (setq g_oex (vlax-get-or-create-object "Excel.Application"))
    (vlax-put-property g_oex 'SheetsInNewWorkbook 1)
    (vlax-put-property g_oex 'Visible :vlax-true)
    (setq g_wbs (vlax-get-property g_oex 'Workbooks))
    (setq g_cb (vlax-invoke-method g_wbs 'Add))
    (setq g_shs (vlax-get-property g_cb 'Sheets))
    (setq g_csh (vlax-get-property g_shs 'Item 1))
    (vlax-put-property g_csh 'Name "Координаты")


    (repeat point_count
       (setq pt (nth point_number lst));координаты текущей узловой точки
       (setq pt_next (nth (rem (1+ point_number) point_count) lst));координаты следующей узловой точки (по кругу)
       (setq X (car pt));координата X точки
       (setq Y (cadr pt));кооордината Y точки
       (setq X_next (car pt_next));координата X следующей точки
       (setq Y_next (cadr pt_next));координата Y следующей точки
       (setq Dist (geo_get_distance pt pt_next));расстояние между двумя координатами
       (setq Ang (geo_get_angle (list Y X) (list Y_next X_next)));угол между двумя координатами
       (setq StAng (angtos ang 1 3));Преобразовываем в строку
       (setq StAng (vl-string-subst "° " "d" StAng));Заменяем символ d(град) на символ '° '
       (setq StAng (vl-string-subst "' " "'" stang));Заменяем символ '(мин) на символ '' '    


       (setq RangeN (strcat "A" (itoa (1+ point_number))));Диапазон ячеек для номера точки
       (setq RangeX (strcat "B" (itoa (1+ point_number))));Диапазон ячеек для координаты X
       (setq RangeY (strcat "C" (itoa (1+ point_number))));Диапазон ячеек для координаты Y
       (setq RangeD (strcat "D" (itoa (1+ point_number))));Диапазон ячеек для расстояния  
       (setq RangeA (strcat "E" (itoa (1+ point_number))));Диапазон ячеек для угла        

       (setq g_r0 (vlax-get-property g_oex "Range" RangeN))
       (setq g_r1 (vlax-get-property g_oex "Range" RangeX))
       (setq g_r2 (vlax-get-property g_oex "Range" RangeY))
       (setq g_r3 (vlax-get-property g_oex "Range" RangeD))
       (setq g_r4 (vlax-get-property g_oex "Range" RangeA))

       (vlax-put-property g_r0 "value2" (1+ point_number))
       (vlax-put-property g_r1 "value2" (rtos Y 2 3))
       (vlax-put-property g_r2 "value2" (rtos X 2 3))
       (vlax-put-property g_r3 "value2" (rtos Dist 2 2))
       (vlax-put-property g_r4 "value2" StAng)

       (setq point_number (1+ point_number))
    );end of repeat
    

    (if (and g_r0 (not (vlax-object-released-p g_r0)))
        (vlax-release-object g_r0))
    
    (if (and g_r1 (not (vlax-object-released-p g_r1)))
        (vlax-release-object g_r1))
    
    (if (and g_r2 (not (vlax-object-released-p g_r2)))
        (vlax-release-object g_r2))

    (if (and g_r3 (not (vlax-object-released-p g_r3)))
        (vlax-release-object g_r3))

    (if (and g_r4 (not (vlax-object-released-p g_r4)))
        (vlax-release-object g_r4))

    (if (and g_csh (not (vlax-object-released-p g_csh)))
        (vlax-release-object g_csh))

    (if (and g_shs (not (vlax-object-released-p g_shs)))
        (vlax-release-object g_shs))

    (if (and g_cb (not (vlax-object-released-p g_cb)))
        (vlax-release-object g_cb))

    (if (and g_wbs (not (vlax-object-released-p g_wbs)))
        (vlax-release-object g_wbs))
    
    (if (and g_oex (not (vlax-object-released-p g_oex)))
        (vlax-release-object g_oex))
    ;Обнуление использованных глобальных переменных
    (setq g_r0 nil g_r1 nil  g_r2 nil g_r3 nil g_r3 nil g_csh nil g_shs nil g_cb nil g_wbs nil g_oex nil)
    ;Сборка мусора
    (gc)
    
)





(defun geo_point_table ()
  (setq pnt nil)
  (setq nline 0)
  (setq rows nil);список для всех координат типа: ((x,y,z)(x,y,z)...)
  
  ;Запрос на ввод точек
  (while 
    (setq pnt (getpoint "\nУкажите координату: "))
    (setq nline (1+ nline));увеличиваем количество строк на 1
    ;формируем список с координатами
    (setq row pnt);списку row присваеваем список pnt с координатами выбранной точки
    (setq rows (append rows (list row) ));добавляем список row c коорд. выбранной точки в список со всеми коорд. rows    
  );while  

  ;Запрос на ввод коорд. левого верхнего угла таблицы  
  (setq InsertionPoint nil)                  
  (setq InsertionPoint (getpoint "\nУкажите координаты левого верхнего угла таблицы: "))

  ;Запоминаем значения сист.переменных                   
  (setq ORT (getvar "ORTHOMODE"));ORTHO                  
  (setq SN (getvar "SNAPMODE"));SNAP                     
  (setq OSN (getvar "OSMODE"));OSNAP
  (setq DIMZ (getvar "DIMZIN"));DIMZIN
  (setq TEXT (getvar "TEXTSTYLE"));TEXTSTYLE
  (setq COLOR(getvar "CECOLOR"));CECOLOR
  ;Задаём значения сист.переменным                       
  (setvar "ORTHOMODE" 0);ORTHO                           
  (setvar "SNAPMODE" 0);SNAP                             
  (setvar "OSMODE" 0);OSNAP                              
  (setvar "DIMZIN" 0);DIMZIN
  (setvar "CECOLOR" "251");CECOLOR

  (DrawLines InsertionPoint nline);создаём линии таблицы
  (setvar "CECOLOR" COLOR);CECOLOR
  (DrawText InsertionPoint nline 2.0 rows);создаём текст в таблице

  ;возвращаем знач. сист.переменных в начальное состояние
  (setvar "ORTHOMODE" ORT);ORTHO                         
  (setvar "SNAPMODE" SN);SNAP                            
  (setvar "OSMODE" OSN);OSNAP                            
  (setvar "DIMZIN" DIMZ);DIMZIN
  (setvar "TEXTSTYLE" TEXT);TEXTSTYLE

);_end defun geo-draw-table



(
defun DrawLines(InsertionPoint nline)
  ;InsertionPoint - точка вставки
  ;nline - количество строк
  (setq width 104 h 4);ширина таблицы\высота строк\
  
  ;чертим гор.линии шапки таблицы
  (setq xx (car InsertionPoint) yy (cadr InsertionPoint))
  (geo-add-line (list xx yy) (list (+ xx width) yy) acLnWtByLayer);первая линия, с началом в точке InsertionPoint
  (geo-add-line (list (+ xx 13) (- yy h)) (list (+ xx 57) (- yy h)) acLnWtByLayer);вторая линия  
  (geo-add-line (list xx (- yy 8)) (list (+ xx width) (- yy 8)) acLnWtByLayer);третья линия

  ;чертим гор. линии таблицы
  (setq yy (- yy 12))
  (repeat nline
    (geo-add-line (list xx yy) (list (+ xx width) yy) acLnWtByLayer)
    (setq yy (- yy h))
  );_end repeat

  ;чертим вертикальные линии таблицы
  (setq xx (car InsertionPoint) yy (cadr InsertionPoint))
  (geo-add-line (list xx yy) (list xx (- yy 8 (* h nline))) acLnWtByLayer);первая линия  
  (geo-add-line (list (+ xx 13) yy) (list (+ xx 13) (- yy 8 (* h nline))) acLnWtByLayer);вторая линия
  (geo-add-line (list (+ xx 35) (- yy h)) (list (+ xx 35) (- yy 8 (* h nline))) acLnWtByLayer);третья линия
  (geo-add-line (list (+ xx 57) yy) (list (+ xx 57) (- yy 8 (* h nline))) acLnWtByLayer);четвёртая линия 
  (geo-add-line (list (+ xx 74) yy) (list (+ xx 74) (- yy 8 (* h nline))) acLnWtByLayer);пятая линия
  (geo-add-line (list (+ xx 91) yy) (list (+ xx 91) (- yy 8 (* h nline))) acLnWtByLayer);шестая линия
  (geo-add-line (list (+ xx 104) yy) (list (+ xx 104) (- yy 8 (* h nline))) acLnWtByLayer);седьмая линия    

);_end defun DrawLines



(
defun DrawText(InsertionPoint nline h rows)
  ;InsertionPoint - коорд. левого верхнего угла таблицы
  ;nline - количество строк
  ;h - высота текста
  ;rows - список со всеми координатами типа: ((x,y,z)(x,y,z)...)
  
  ;Шапка таблицы
  ;(command "_STYLE" "Table(Geocad)" "Times New Roman" 0.0 1.0 0.0 "N" "N");создаём новый текст.стиль "Table(Geocad)"
  ;(setvar "TEXTSTYLE" "Table(Geocad)");TEXTSTYLE

  (setq xx (car InsertionPoint) yy (cadr InsertionPoint))
  (geo-add-text "Номер" (list (+ xx 2.5) (- yy 3)) h acAlignmentLeft 0)
  (geo-add-text "точки" (list (+ xx 3) (- yy 6)) h acAlignmentLeft 0)
  (geo-add-text "К О О Р Д И Н А Т Ы" (list (+ xx 21) (- yy 3)) h acAlignmentLeft 0)
  (geo-add-text "X" (list (+ xx 23) (- yy 7)) h acAlignmentLeft 0)
  (geo-add-text "Y" (list (+ xx 44.5) (- yy 7)) h acAlignmentLeft 0)
  (geo-add-text "Дир.углы" (list (+ xx 60) (- yy 4.5)) h acAlignmentLeft 0)
  (geo-add-text "Меры" (list (+ xx 79) (- yy 3)) h acAlignmentLeft 0)
  (geo-add-text "линий,м" (list (+ xx 77.5) (- yy 6)) h acAlignmentLeft 0)
  (geo-add-text "На" (list (+ xx 96) (- yy 3)) h acAlignmentLeft 0)
  (geo-add-text "точку" (list (+ xx 94) (- yy 6)) h acAlignmentLeft 0)

  ;Таблица
  (setq i 1);счётчик
  (setq nlist 0);список с коорд.(x,y,z) в списке со всеми коорд. 
  (repeat nline
    ;номера точек
    (geo-add-text (rtos i 2 0) (list (+ xx 6.5) (- yy 11)) h acAlignmentCenter 0);выводим в перв. столбец номер точки

    (if (= i nline) (setq i 0));если последняя точка, в последнем столбце для точек пишем начальную точку
    (geo-add-text (rtos (1+ i) 2 0) (list (+ xx 97.5) (- yy 11)) h acAlignmentCenter 0);выводим в последний столбец номер точки

    ;координаты X и Y
    (setq kx (nth 0 (nth nlist rows)));коорд. X
    (setq ky (nth 1 (nth nlist rows)));коорд. Y
    (geo-add-text (rtos ky 2 3) (list (+ xx 24) (- yy 11)) h acAlignmentCenter 0);выводим X\переворачиваем координаты
    (geo-add-text (rtos kx 2 3) (list (+ xx 46) (- yy 11)) h acAlignmentCenter 0);выводим Y\переворачиваем координаты
     
    ;Дир.углы
    (setq a1 (nth nlist rows));первая координата
    (setq a2 (nth (rem (1+ nlist) nline) rows));вторая координата
    
    (setq x1 (car a1) y1 (cadr a1));выбираем из списка координат а1 x и y
    (setq x2 (car a2) y2 (cadr a2));выбираем из списка координат а2 x и y    
    (setq k1 (list y1 x1));меняем x и y и заносим в список 
    (setq k2 (list y2 x2));меняем x и y и заносим в список 


    (setq ang (geo_get_angle k1 k2));вычисляем угол\переворачиваем координаты
    (setq stang (angtos ang 1 3));преобразуем угол в стороку с точностью 3
    (setq stang (vl-string-subst "° " "d" stang));заменяем символ d(град) на символ '° '
    (setq stang (vl-string-subst "' " "'" stang));заменяем символ '(мин) на символ '' '(c пробелом)
    (geo-add-text stang (list (+ xx 65.5) (- yy 11)) h acAlignmentCenter 0);выводим угол в град,мин,сек. 

    ;Расстояние
    (setq pnt1 (nth nlist rows));первая координата
    (setq pnt2 (nth (rem (1+ nlist) nline) rows));вторая координата
    (setq dist (geo_get_distance pnt1 pnt2))
    (geo-add-text (rtos dist 2 2) (list (+ xx 82.5) (- yy 11)) h acAlignmentCenter 0);выводим расстояние
  
    (setq i (1+ i));увеличиваем i на 1
    (setq yy (- yy 4));уменьшаем yy на 4
    (setq nlist (1+ nlist));увеличиваем nlist на 1
  )

  
);_end defun DrawText
;----------------------------------------------------------------------------------------------------------------------------

Последний раз редактировалось Кулик Алексей aka kpblc, 08.09.2011 в 22:18. Причина: Уточнил
aleksandr1981 вне форума  
 
Непрочитано 08.09.2011, 16:15
#1598
Ubivec81

проектирование железных дорог
 
Регистрация: 12.04.2010
Самара
Сообщений: 60
<phrase 1=


Создал простейшую таблицу и получил вот такой DXF-список данных примитива
Код:
[Выделить все]
 ((-1 . <Имя объекта: 786250f8>) (0 . "ACAD_TABLE") (330 . <Имя объекта: 
7dc43cf8>) (5 . "54F") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") 
(100 . "AcDbBlockReference") (2 . "*T11") (10 2504.03 1052.2 0.0) (41 . 1.0) 
(42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 
0.0 0.0 1.0) (100 . "AcDbTable") (342 . <Имя объекта: 7dc43e38>) (343 . <Имя 
объекта: 78625100>) (11 1.0 0.0 0.0) (90 . 22) (91 . 3) (92 . 1) (93 . 0) (94 . 
0) (95 . 0) (96 . 0) (141 . 43.0) (141 . 33.0) (141 . 33.0) (142 . 20.0) (171 . 
1) (172 . 0) (173 . 0) (174 . 0) (175 . 1) (176 . 1) (91 . 0) (178 . 0) (145 . 
0.0) (92 . 0) (301 . "CELL_VALUE") (93 . 7) (90 . 0) (94 . 0) (300 . "") (302 . 
"") (304 . "ACVALUE_END") (171 . 1) (172 . 0) (173 . 0) (174 . 0) (175 . 1) 
(176 . 1) (91 . 0) (178 . 0) (145 . 0.0) (92 . 0) (301 . "CELL_VALUE") (93 . 7) 
(90 . 0) (94 . 0) (300 . "") (302 . "") (304 . "ACVALUE_END") (171 . 1) (172 . 
0) (173 . 0) (174 . 0) (175 . 1) (176 . 1) (91 . 0) (178 . 0) (145 . 0.0) (92 . 
0) (301 . "CELL_VALUE") (93 . 7) (90 . 0) (94 . 0) (300 . "") (302 . "") (304 . 
"ACVALUE_END"))
Теперь хочу заменить один элемент списка (300 . "") на (300 . "XXX")

Код:
[Выделить все]
 (setq sps_dxf (entget(entlast)))
(setq qwe (assoc 300 sps_dxf))
(setq sps_dxf (subst '(300 . "XXX") 'qwe sps_dxf))
Но после этого список не меняется. Что я не так делаю?
Ubivec81 вне форума  
 
Непрочитано 08.09.2011, 16:33
#1599
VVA

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


посчитай, сколько полей с кодом 300 в твоем листинге
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 08.09.2011, 16:37
#1600
Ubivec81

проектирование железных дорог
 
Регистрация: 12.04.2010
Самара
Сообщений: 60
<phrase 1=


3 так как три строки (как я понимаю). а что делать тогда с этим?
Ubivec81 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12
Сейсмозащита и сейсмоизоляция существующих, построенных зд. IANationalInformAgentstvo Прочее. Архитектура и строительство 216 20.01.2015 16:51
Мониторы LCD CRT Разное 94 17.06.2008 10:51
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46