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

Вернуться   Форум 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.
Просмотров: 1972948
 
Непрочитано 08.11.2012, 13:39
#1961
papelard


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


Ребят, пожалуйста, помогите разобраться. Сам я человек от программирования далекий - неделю разбирался как в лиспе заштриховать кружок и шрифт у текста поменять .
По поводу отмены введеной точки могу только догадываться что надо разбираться с функциями vla-startundomark и vla-endundomark которые в этом лиспе уже есть но я не совсем понимаю как они работают.
По поводу выноски догадываюсь что в этот фрагмент лиспа
Код:
[Выделить все]
(setq blk_def (vla-add (vla-get-blocks adoc) (vlax-3d-point '(0. 0. 0.)) blk_name)
	             circle  (vla-addcircle blk_def (vlax-3d-point '(0. 0. 0.)) 1.)
	             att     (vla-addattribute blk_def
	                                       2.5
	                                       acattributemodepreset
	                                       "Номер точки"
	                                       (vlax-3d-point '(1. 1. 0.))
	                                       "PointNumber"
	                                       "-"
	                                       ) ;_ end of vla-AddAttribute
	             ) ;_ end of setq
надо вписать функцию vla-addleader, как работает которая я опять же не разобрался, и как связать выноску с атрибутом тоже не понимаю.

Может кто из старожилов форума подскажет тему (если такая есть на форуме) которая поможет мне с этим разобраться
papelard вне форума  
 
Непрочитано 08.11.2012, 23:02
#1962
Кулик Алексей aka kpblc
Moderator

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


Со временем абсолютный "затык", поэтому попытаюсь объяснить кратко:
#1957 - это создание описания блока и его наполненности, не более того. Чтобы сделать то, что хочется, надо переделывать кусок
Код:
[Выделить все]
   (while (= (type (setq pt (vl-catch-all-apply
                             (function
                               (lambda ()
                                 (trans (getpoint "\nУкажите точку <Хватит> : ") 1 0)
                                 ) ;_ end of lambda
                               ) ;_ end of function
                             ) ;_ end of vl-catch-all-apply
                        ) ;_ end of setq
                  ) ;_ end of type
            'list
            ) ;_ end of =
;;; <...>
    ) ;_ end of while
Причем переделывать надо именно условие while в части получения точки.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.11.2012, 09:17
#1963
papelard


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


да уж, дело ясное что дело темное
papelard вне форума  
 
Непрочитано 17.11.2012, 18:36
#1964
Alevtina R

инженер
 
Регистрация: 17.11.2012
Казань
Сообщений: 8


добрый вечер! Недавно начала осваивать лисп, возникла вот такая загвоздка: как сделать, чтоб программа создавала блок, если его нет в чертеже, а если есть, то использовала то что есть? тут вроде как нужна функция if. как узнать есть ли описание блока в чертеже?
вот она програмка, писала сама, только не смейтесь
(defun C:ci (/ sc1 rad1 ci1)
(setq sc1 (getdist "\nМасштаб <100>: "))
(if (= sc1 nil)
(setq sc1 100)
);if
(setq rad1 (* 0.8 sc1))
(command "._CIRCLE" "0,0" rad1)
(setq ci1 (entlast))
(command "._BLOCK" "v" (list 0 (- rad1)) ci1 "")
(command "._MEASURE" pause "_B" "v" "" pause pause)
(command "._GROUP" "" "*" "" "_p")
)
Alevtina R вне форума  
 
Непрочитано 17.11.2012, 22:58
#1965
Кулик Алексей aka kpblc
Moderator

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


Для поиска описания блока можно воспользоваться (tblsearch "block" <Имя блока в кавычках>)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.11.2012, 13:00
#1966
Alevtina R

инженер
 
Регистрация: 17.11.2012
Казань
Сообщений: 8


Не получается..
точнее когда описание блока есть в файле программа работает, а когда описания блока нет выдает:
Масштаб <100>:
; ошибка: неверная функция: ""
в чем может быть ошибка?

(defun C:ci (/ sc1 rad1 ci1 vs1)
(setq s1 (tblsearch "block" "v"))
(if (= s1 nil)
((setq sc1 (getstring "\nМасштаб <100>: "))
(if (= sc1 nil)
(setq sc1 100)
);if
(setq rad1 (* 0.8 sc1))
(command "._CIRCLE" "0,0" rad1)
(setq ci1 (entlast))
(setq vs1 (list 0 (- rad1)))
(command "._BLOCK" "v" vs1 ci1 "")
)
);if
(command "._MEASURE" pause "_B" "v" "" pause pause)
(command "._GROUP" "" "*" "" "_p" "")
(princ)
)
Alevtina R вне форума  
 
Непрочитано 18.11.2012, 13:18
#1967
gomer

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


Цитата:
Сообщение от Alevtina R Посмотреть сообщение
Не получается..
и не получится, потому что надо знать что делаешь!

Цитата:
Сообщение от Alevtina R Посмотреть сообщение
((setq sc1 (getstring "\nМасштаб <100>: "))
Здесь сразу 2 ошибки

Код:
[Выделить все]
 (defun C:CI (/ sc1 s1 rad1 vs1 ci1)

  (setq sc1 (getreal "\nМасштаб <100>: "))

  (or sc1 (setq sc1 100.))

  (if (not (setq s1 (tblsearch "BLOCK" "v")))
    (progn
      (setq rad1 (* 0.8 sc1)
	    vs1	 (list 0. (- rad1))
      )
      (command "._CIRCLE" "0,0" rad1)
      (setq ci1 (entlast))
      (command "._BLOCK" "v" vs1 ci1 "")
    )
  )

  (command "._MEASURE" pause "_B" "v" "" pause pause)
  (command "._GROUP" "" "*" "" "_p" "")

  (princ)
)
вот так чет там рисует
gomer вне форума  
 
Непрочитано 18.11.2012, 14:27
#1968
Alevtina R

инженер
 
Регистрация: 17.11.2012
Казань
Сообщений: 8


спасибоздорово, все рисует!
Ну да, я не совсем знаю что делаю.. потому что я только учусь..
Alevtina R вне форума  
 
Непрочитано 18.11.2012, 17:48
#1969
gomer

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


объясняю, вы спрашиваете строку (getstring), потом используете ее как вещественное число, ну и со скобками запутались
gomer вне форума  
 
Непрочитано 24.11.2012, 19:36
#1970
Alevtina R

инженер
 
Регистрация: 17.11.2012
Казань
Сообщений: 8


Добрый вечер! При вставке блоков через программу блоки поворачиваются на некоторый угол, (правда не все, а только некоторые). Не пойму это у меня программа с косяком или сами блоки?
Снова не пойму где я не так делаю..программу и файл прилагаю.
Программа:

Код:
[Выделить все]
 (defun errorinsc (message)
  (command)
  (setvar "CMDECHO" cm1)
  (setvar "CECOLOR" cc1)
  (setvar "CELTYPE" clt1)
  (setvar "CELWEIGHT" clw1)
  (setvar "CLAYER" la1)
  (setq *error* existError)
  (prompt "\nСистемные переменные восстановленны: ")
  (princ)
);defun errorinsc3
(defun C:INA (/ existError in1 cm1 cc1 clt1 clw1 la1 er1)
  (setq existError *error*)
  (setq *error* errorinsc)
  (setq cm1 (getvar "CMDECHO")
	cc1 (getvar "CECOLOR")
	clt1 (getvar "CELTYPE")
	clw1 (getvar "CELWEIGHT")
        la1 (getvar "CLAYER")
  );setq
  (setvar "CMDECHO" 0)
  (command "._UNDO" "_be")
  (command "._INSERT" "библиотека блоков оформления.dwg" "0,0" "" "" "")
  (setq er1 (entlast))
  (command "._ERASE" er1 "")
  (command "._LAYER" "_N" "В-ОФОРМЛЕНИЕ" "_C" "250" "В-ОФОРМЛЕНИЕ" "_Lw" 0.20 "В-ОФОРМЛЕНИЕ" "_S" "В-ОФОРМЛЕНИЕ" "")
  (setvar "CECOLOR" "BYLAYER")
  (setvar "CELTYPE" "BYLAYER")
  (setvar "CELWEIGHT" -1)
  (or sc1 (setq sc1 (getreal "\nМасштаб: ")))
  (setq in1 (getpoint "Точка вставки: "))
  (while in1
    (command "._INSERT" "фигурная скобка" in1 sc1 sc1 "0")
    (setq in1 (getpoint "Точка вставки: "))
  );while
  (command "._UNDO" "_end")
  (setvar "CMDECHO" cm1)
  (setvar "CECOLOR" cc1)
  (setvar "CELTYPE" clt1)
  (setvar "CELWEIGHT" clw1)
  (setvar "CLAYER" la1)
  (setq *error* existError)
  (princ)
);defun ina
Вложения
Тип файла: dwg
DWG 2010
файл с косяками.dwg (100.3 Кб, 5780 просмотров)

Последний раз редактировалось Кулик Алексей aka kpblc, 24.11.2012 в 20:44.
Alevtina R вне форума  
 
Непрочитано 24.11.2012, 20:11
#1971
gomer

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


OSMODE отключить забыла
gomer вне форума  
 
Непрочитано 25.11.2012, 09:49
#1972
Alevtina R

инженер
 
Регистрация: 17.11.2012
Казань
Сообщений: 8


Всё равно поворачивает эти 2 блока "линия разрыва" и "фигурная скобка", все остальные еще 10 штук вставляются нормально с привязкой и в любом варианте команды "._INSERT".

Пробовала значения 0, 20535, 16384 и через кнопку отключать. Попробовала разные варианты команды "._INSERT"
на варианты:
(command "._INSERT" "фигурная скобка" in1 sc1 sc1 "0")
(command "._INSERT" "фигурная скобка" in1 sc1 sc1 "")
вставляет и поворачивает
на вариант:
(command "._INSERT" "фигурная скобка" in1 sc1 sc1 pause)
1 раз вставляет, а дальше пишет:
"Точка вставки: Точка вставки:
Неверное определение рамки.
Системные переменные восстановленны:"

Последний раз редактировалось Alevtina R, 25.11.2012 в 11:18.
Alevtina R вне форума  
 
Непрочитано 25.11.2012, 11:37
#1973
gomer

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


1. Поспешили вы, Алевтина, глушить вывод в командную строку, дело то не в привязках оказалось
2. Учитесь разбивать программы на фрагменты и выстраивать их логику
3. Ну вот так у меня получилось:

Код:
[Выделить все]
 (defun errorinsc (message)

  (end_cmd)

)

(defun start_cmd ()
  (setq existError *error*)
  (setq *error* errorinsc)
  (setq
    osm	 (getvar "OSMODE")
    cm1	 (getvar "CMDECHO")
    cc1	 (getvar "CECOLOR")
    clt1 (getvar "CELTYPE")
    clw1 (getvar "CELWEIGHT")
    la1	 (getvar "CLAYER")
  )
  (setvar "OSMODE" 0)
  (setvar "CMDECHO" 0)
  (command "._UNDO" "_be")
)

(defun end_cmd ()
  (command "._UNDO" "_end")
  (setvar "CMDECHO" cm1)
  (setvar "CECOLOR" cc1)
  (setvar "CELTYPE" clt1)
  (setvar "CELWEIGHT" clw1)
  (setvar "CLAYER" la1)
  (prompt "\nСистемные переменные восстановлены")
  (setq *error* existError)
  (princ)
)



(defun C:INA (/ in1 osm cm1 cc1 clt1 clw1 la1 er1)

  (start_cmd)

  (if (not (tblsearch "BLOCK" "библиотека блоков оформления"))
   (progn (command
      "_.INSERT"	    "библиотека блоков оформления.dwg"
      "S"		    1			  "0,0"
      0
     )
    (command "_.ERASE" (entlast) ""))
  )

  (if (not (tblsearch "LAYER" "В-ОФОРМЛЕНИЕ"))
    (command
      "._LAYER"	    "_N"	  "В-ОФОРМЛЕНИЕ"
      "_C"	    "250"	  "В-ОФОРМЛЕНИЕ"
      "_Lw"	    0.20	  "В-ОФОРМЛЕНИЕ"
      "_S"	    "В-ОФОРМЛЕНИЕ"		""
     )
  )


  (setvar "CECOLOR" "BYLAYER")
  (setvar "CELTYPE" "BYLAYER")
  (setvar "CELWEIGHT" -1)

  (if (or *sc1* (setq *sc1* (getreal "\nМасштаб: ")))

    (while (setq in1 (getpoint "Точка вставки: "))
      (command "_.INSERT" "фигурная скобка" "_S" *sc1* in1 0)

    )
  )

  (end_cmd)
)

Последний раз редактировалось gomer, 25.11.2012 в 17:34. Причина: ошибка: блок библиотеки должен удаляться при вставке, а не вместо
gomer вне форума  
 
Непрочитано 25.11.2012, 15:33
#1974
Alevtina R

инженер
 
Регистрация: 17.11.2012
Казань
Сообщений: 8


А можно пояснить как это делается, хотя бы на примере этой программы?

(command "_.INSERT" "фигурная скобка" "_S" *sc1* in1 0)
что значит "_S" ?

Последний раз редактировалось Alevtina R, 25.11.2012 в 15:43.
Alevtina R вне форума  
 
Непрочитано 25.11.2012, 17:28
#1975
gomer

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


попробуйте вручную ввести -INSERT, и посмотреть опции команды, это масштаб вставки блока
Важно понимать какие события происходят в команде, следовательно какие режимы можно выделить в отдельные функции. Их можно унифицировать и использовать в других командах
Ну вот, так получилось, чуть посложнее:
Код:
[Выделить все]
 (defun errorinsc (message)
  ;; тут желательно добавить обработчик ошибок
  ;; по нажатию ESC
  (end_cmd)

)

(defun start_cmd ()
  ;; начинаем нашу команду
  (vl-load-com)

  (if (logand 8 (getvar "UNDOCTL")) ; заканчиваем предыдущую группу UNDO
    (vla-EndUndoMark
      (setq adoc (vla-get-ActiveDocument (vlax-get-acad-object)))
    )
  )

  (vla-StartUndoMark adoc) ; начинаем новую группу UNDO

  ;; настраиваем вывод служебных сообщений
  (if (setq *NOMUTE* T)
    (princ "\nСохранение системных переменных")
  )
  ;; сохраняем системные пременные
  (setq
    osm	       (getvar "OSMODE")
    cm1	       (getvar "CMDECHO")
    cc1	       (getvar "CECOLOR")
    clt1       (getvar "CELTYPE")
    clw1       (getvar "CELWEIGHT")
    la1	       (getvar "CLAYER")
    existError *error* ; и 'системный' обработчик ошибок
    *error*    errorinsc
  )
)

(defun end_cmd ()
  ;; возвращаем системные пременные
  (setvar "CMDECHO" cm1)
  (setvar "CECOLOR" cc1)
  (setvar "CELTYPE" clt1)
  (setvar "CELWEIGHT" clw1)
  (setvar "CLAYER" la1)
  (if *NOMUTE*
    (princ "\nСистемные переменные восстановлены")
  )
  (setq *error* existError)

  (vla-EndUndoMark adoc)		; заканчиваем команду
  (princ)
)

(defun set_ui_mode ()
  (setvar "CMDECHO" 1)			; отображаем пользовательский ввод
  (setvar "OSMODE" osm)			; здесь устанавливаем значение по вкусу
  (setvar "CLAYER" la1)			; делаем незаметным именение слоя
)

(defun set_insert_mode ()
  (setvar "CMDECHO" 0)                         ; глушим вывод в командную строку
  (if (not (tblsearch "LAYER" "В-ОФОРМЛЕНИЕ"))
    (command				; создаем слой, если его нет
      "._LAYER"	    "_N"	  "В-ОФОРМЛЕНИЕ"
      "_C"	    "250"	  "В-ОФОРМЛЕНИЕ"
      "_Lw"	    0.20	  "В-ОФОРМЛЕНИЕ"
      "_S"	    "В-ОФОРМЛЕНИЕ"		""
     )
    (setvar "CLAYER" "В-ОФОРМЛЕНИЕ")	; или устанавливаем текущим
  )

  (setvar "OSMODE" 0)			; убираем привязку
  (setvar "CECOLOR" "BYLAYER")
  (setvar "CELTYPE" "BYLAYER")
  (setvar "CELWEIGHT" -1)
)

(defun insert_blklib ()
  (if (not (tblsearch "BLOCK" "библиотека блоков оформления"))
   (progn
    (command
      ;; здесь еще желательно добавить проверку существования
      ;; файла библиотеки. Как по мне, лучше хранить блоки в
      ;; отделном файле
      "_.INSERT"	    "библиотека блоков оформления.dwg"
      "S"		    1			  "0,0"
      0
     )
    (entdel (entlast)) ; удаляем блок
    )
  )
)


(defun C:INA (/ adoc in1 osm cm1 cc1 clt1 clw1 la1 er1)

  (start_cmd)				; сохраняем системные переменные

  ;; выбираем масштаб или завершаем команду
  ;; это первый источник возможной ошибки  
  (if (or *sc1* (setq *sc1* (getreal "\nМасштаб: ")))
    (progn

      (set_ui_mode)			; включаем режим пользовательского ввода

      ;; получаем точку вставки блока
      ;; это второй источник возможной ошибки
      (setq in1 (getpoint "Точка вставки: "))

      (set_insert_mode)			; перключаемся в режим вставки блока

      (insert_blklib)			; вставляем библиотеку, если ее нет в файле

      ;; вставляем блок, можно было бы объединить с предыдущей функцией,
      ;; но иногда приходится вставлять несколько блоков сразу
      (command "_.INSERT" "фигурная скобка" "_S" *sc1* in1 0)

      ;; повторяем действия
      (while (progn (set_ui_mode)
		    (setq in1 (getpoint "Точка вставки: "))
	     )
	(set_insert_mode)
	(command "_.INSERT" "фигурная скобка" "_S" *sc1* in1 0)
      )
    )
  )
  
  (end_cmd)
  
)
Offtop: ps ох, чет я не соображаю, видимо ноябрь...

Последний раз редактировалось gomer, 25.11.2012 в 17:35.
gomer вне форума  
 
Непрочитано 25.11.2012, 18:23
#1976
Alevtina R

инженер
 
Регистрация: 17.11.2012
Казань
Сообщений: 8


Спасибо пойду изучать
Alevtina R вне форума  
 
Непрочитано 28.11.2012, 15:19
#1977
Alevtina R

инженер
 
Регистрация: 17.11.2012
Казань
Сообщений: 8


Можно поподробнее про проверку существования файла библиотеки или ссылочку какую-нибудь
я чего-то ничего не нашла..
Alevtina R вне форума  
 
Непрочитано 28.11.2012, 18:33
#1978
gomer

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


Цитата:
Сообщение от Alevtina R Посмотреть сообщение
Можно поподробнее про проверку существования файла библиотеки
самый простой способ:
Код:
[Выделить все]
 (if (setq fn (findfile "blklibpath/blk_lib.dwg")) 
  (command "_.INSERT" fn nil)
)
gomer вне форума  
 
Непрочитано 29.11.2012, 08:45
#1979
dirge


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


Ребята, всем привет! Подскажите можно ли из лиспа вытащить имя свойства объекта?
dirge вне форума  
 
Непрочитано 04.12.2012, 16:31
#1980
papelard


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


У меня вопрос к знатокам.
Мне необходимо чтобы лисп создавал *.CSV файл в котором помимо координат и номеров точек должен присутствовать текст с формулой которая содержит символы и Δ.

Так вот если лисп сохранен в кодировке ANSI то эти символы в CSV заменяются на “v” и “?” и приходится в Notepad++’е конвертировать CSV в UTF-8 а после уже делать замену символов.

Если же лисп сохранить в кодировке UTF-8 то весь русский текст лиспа в AutoCAD-е превращается в набор иероглифов, а полученный CSV если его открывать в Notepad++ выглядит вроде как и надо бы, но если открывать его в excel’е весь русский текст превращается в иероглифы. И программа для которой по идее и создается этот CSV не хочет импортировать данные из него.

Так вот собственно вопрос. Как сделать так, чтобы символы √ и Δ и русский текст отображались корректно в экспортированном CSV-файле, а русский текст не превращался в иероглифы в AutoCAD’е и вообще возможно ли это?
papelard вне форума  
Ответ
Вернуться   Форум 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