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

Вернуться   Форум 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.
Просмотров: 1973011
 
Непрочитано 04.11.2014, 19:03
1 | #2321
Дима_

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


Только не номера, а индекса - это важное отличие, итератор может быть индексирован через любые типы данных.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 04.11.2014, 19:49
#2322
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,049


SetQ , Дима_ Спасибо. Примерно я догадывался по Item, что это доступ к коллекции. Но терзали смутные сомнения - нет ли какого-то приведения типов или еще подобного.
Сергей812 вне форума  
 
Непрочитано 05.11.2014, 07:46
#2323
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Цитата:
Сообщение от wahir Посмотреть сообщение
какой книге удобно сведены в таблицы dxf-коды примитивов с описаниями возможных значений?
по моему, в родной справке все хорошо описано (по крайней мере в той, что идет с акад 2010)
Цитата:
Сообщение от wahir Посмотреть сообщение
конкретно сейчас меня интересует создание размеров.
Код:
[Выделить все]
 
(defun create-dim-rotated (pv pn pk adim / )
(entmakex (list
    (cons 0 "DIMENSION") ;*
    (cons 100 "AcDbEntity") ;*
    (cons 100 "AcDbDimension") ;*
    (cons 10 pv)   
    (cons 70 32) ;*
    (cons 51 adim)
    (cons 3 "2-100")
    (cons 100 "AcDbAlignedDimension") ;*
    (cons 13 pn)
    (cons 14 pk)
    (cons 50 adim)
    (cons 100 "AcDbRotatedDimension") ;*
   )
) ;_ end of entmakex
);end create-dim-rotated
pv pn pk - точки начало конца и положения размерной линии, adim - угол наклона в радианах
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Непрочитано 05.11.2014, 09:10
#2324
Кулик Алексей aka kpblc
Moderator

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


Это справедливо только при создании выровненного (Aligned) размера...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.11.2014, 11:25
#2325
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


дык, такой и задуман был... параллельный как то даже не рассматривался, он мне в программном исполнении не нужен. и это всего лишь пример. Еще тут игрался с размером повернутым

з.ы. вспомнил про один вопрос, не так давно возникал...
Ситуация такая: надо примитиву задать толщину (370 группа). когда она "по слою" entget её вообще не выдает, соответственно subst её найти не может и entmod получает исходный список...
В таком случае надо дописывать проверку наличия данной группы и добавлять её другим способом? (я, что бы долго не думать, пошел через vla-put...)
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...

Последний раз редактировалось Vladimir_Sergeevich, 05.11.2014 в 11:36.
Vladimir_Sergeevich вне форума  
 
Непрочитано 05.11.2014, 11:39
#2326
Кулик Алексей aka kpblc
Moderator

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


Как материал для размышления (код сперт с "САПР на базе"):
Код:
[Выделить все]
 (defun _kpblc-ent-modify-autoregen (ent bit value ext_regen / ent_list old_dxf new_dxf layer_dxf70)
                                   ;|
*    Функция модификации указанного бита примитива
*    Параметры вызова:
*  entity  - примитив, полученный через (entsel), (entlast) etc
*  bit  - dxf-код, значение которого надо установить
*  value  - новое значение
*  regen  - выполнять или нет регенерацию примитива сразу. t/ nil
*    Примеры вызова:
(_kpblc-ent-modify-autoregen (entlast) 8 "0" t)  ; перенести последний примитив на слой 0
(_kpblc-ent-modify-autoregen (entsel) 62 10 nil)  ; установить выбранному примитиву цвет 10
*    Возвращаемое значение:
*  примитив с модифицированным dxf-списком. Примитив перерисовывается в
* зависимости от значения ключа ext_regen
|;
  (setq ent (_kpblc-conv-ent-to-ename ent))
  (if (not
        (and
          (or
            (= (strcase (cdr (assoc 0 (entget ent))) nil) "STYLE")
            (= (strcase (cdr (assoc 0 (entget ent))) nil) "DIMSTYLE")
            (= (strcase (cdr (assoc 0 (entget ent))) nil) "LAYER")
            ) ;_ end of or 
          (= bit 100)
          ) ;_ end of and 
        ) ;_ end of not 
    (progn
      (setq ent_list (entget ent)
            new_dxf  (cons bit
                           (if (and (= bit 62) (= (type value) 'str))
                             (if (= (strcase value) "BYLAYER")
                               256
                               0
                               ) ;_ end of if 
                             value
                             ) ;_ end of if 
                           ) ;_ end of cons 
            ) ;_ end of setq 
      (if (not (equal new_dxf (setq old_dxf (assoc bit ent_list))))
        (progn
          (entmod (if old_dxf
                    (subst new_dxf old_dxf ent_list)
                    (append ent_list (list new_dxf))
                    ) ;_ end of if 
                  ) ;_ end of entmod
          (if ent_regen
            (entupd ent)
            (redraw ent)
            ) ;_ end of if
          ) ;_ end of progn 
        ) ;_ end of if 
      ) ;_ end of progn 
    ) ;_ end of if 
  ent
  ) ;_ end of defun
Библиотечная функция
Код:
[Выделить все]
 (defun _kpblc-conv-ent-to-ename (ent_value / _lst)
                                ;|
*    Функция преобразования полученного значения в ename
*    Параметры вызова:
*  ent_value  значение, которое надо преобразовать в примитив. Может
*      быть именем примитива, vla-указателем или просто
*      списком.
*      Если не принадлежит ни одному из указанных типов,
*      возвращается nil
*    Примеры вызова:
(_kpblc-conv-ent-to-ename (entlast))
(_kpblc-conv-ent-to-ename (vlax-ename->vla-object (entlast)))
|;
  (cond
    ((= (type ent_value) 'vla-object)
     (vlax-vla-object->ename ent_value)
     )
    ((= (type ent_value) 'ename) ent_value)
    ((and (= (type ent_value) 'str) (handent ent_value) (entget (handent ent_value)))
     (handent ent_value)
     )
    ((and (= (type ent_value) 'str) (handent ent_value) (tblobjname "style" ent_value))
     (tblobjname "style" ent_value)
     )
    ((and (= (type ent_value) 'str) (handent ent_value) (tblobjname "dimstyle" ent_value))
     (tblobjname "dimstyle" ent_value)
     )
    ((and (= (type ent_value) 'str) (handent ent_value) (tblobjname "block" ent_value))
     (tblobjname "block" ent_value)
     )
    ((and (= (type ent_value) 'list) (cdr (assoc -1 ent_value))) (cdr (assoc -1 ent_value)))
    (t nil)
    ) ;_ end of cond
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.11.2014, 15:00
#2327
wahir


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


с созданием размеров через entmake вроде разобрался, не смог понять только одно - как выбрать аннотативный масштаб для размера? в dxf-reference не могу нужных кодов найти, вроде перенес максимум значений из заранее созданного размера, но всё равно не выходит.
Код:
[Выделить все]
 (entmake (list
	   '(0 . "DIMENSION")
	   '(100 . "AcDbEntity")
	   '(67 . 0)
	   '(410 . "Model")
	   '(8 . "$Размеры")
	   '(100 . "AcDbDimension")
	   '(280 . 0)
	   (cons 10 (polar '(0.0 0.0 0.0) 1 (- (/ ds 2))))
	   '(70 . 35)
	   '(71 . 5)
	   '(72 . 1)
	   '(210 0.0 0.0 1.0)
	   '(3 . "Annotative$3")
	   '(100 . "AcDbDiametricDimension")
	   (cons 15 (polar '(0.0 0.0 0.0) 1 (/ ds 2)))
	 );end list
);end entmake
wahir вне форума  
 
Непрочитано 05.11.2014, 15:05
#2328
Кулик Алексей aka kpblc
Moderator

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


Голову ломать немного лениво: http://autolisp.ru/2011/03/17/howto-...tyle-or-block/
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.11.2014, 07:30
#2329
wahir


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Голову ломать немного лениво: http://autolisp.ru/2011/03/17/howto-...tyle-or-block/
или я не понял как это использовать, или плохо объяснил что хочу сделать.
я подразумеваю использование программы с определенным шаблоном чертежей, в котором уже содержится нужный мне аннотативный размерный стиль, мне нужно создать размер в этом стиле.
wahir вне форума  
 
Непрочитано 06.11.2014, 14:15
#2330
Кулик Алексей aka kpblc
Moderator

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


Создаешь стиль и потом устанавливаешь ему аннотативность, или размер - и потом уже аннотативность для объекта. Какая в принципе разница?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.11.2014, 15:05
#2331
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,049


Вроде простой вопрос - но не могу понять логики. Вот тестовый код вставки описаний блоков из другого чертежа:

Код:
[Выделить все]
 (defun sys-InsertDescriptionBlock ( aNameBlock aNameSourceFile / )
	; Если в текущем чертеже нет описания данного блока
  	( if (= (tblsearch "BLOCK" aNameBlock) nil)
		( progn
			; Если существует указанный файл с описаниями блоков
	  		( if (/= (findfile aNameSourceFile) nil)
				; Вставляем все определения блоков из указанного файла
		  		( vl-cmdf "_-INSERT" aNameSourceFile )
				( vl-cmdf )
			)
		)
	)
)
почему, несмотря на наличие имитации отмены ввода ( vl-cmdf ) продолжает запрашивать точку вставки ?
Сергей812 вне форума  
 
Непрочитано 07.11.2014, 15:10
#2332
Кулик Алексей aka kpblc
Moderator

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


Offtop: Сто лет уже так не поступал...
Может, дело в отсутствующем progn ?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.11.2014, 15:18
#2333
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Offtop:
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Offtop: Сто лет уже так не поступал...
Не понял, о чем это ты?
skkkk вне форума  
 
Непрочитано 07.11.2014, 15:20
#2334
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,049


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Offtop: Сто лет уже так не поступал...
Может, дело в отсутствующем progn ?
Точно Спасибо большое. Ну только начал изучать Lisp как альтернативу NetApi - поэтому использую те решения, которые понимаю в данный момент )
Сергей812 вне форума  
 
Непрочитано 07.11.2014, 15:35
#2335
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Offtop:
Не понял, о чем это ты?
Я копирую описания блоков через ObjectDBX - как-то мне такой подход больше понравился.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.11.2014, 22:30
#2336
kakt00z

инженер-проектировщик КИПиА
 
Регистрация: 30.08.2008
Минск
Сообщений: 159


а мне больше так нравится :
(setq tmpblk (vla-InsertBlock #modspace (vlax-3d-point '(0 0 0)) $filepath 0.001 0.001 0.001 0))
с последующим удалением
kakt00z вне форума  
 
Непрочитано 07.11.2014, 22:58
#2337
Кулик Алексей aka kpblc
Moderator

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


В таком случае "тащится" многовато мусора.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 08.11.2014, 00:24
#2338
kakt00z

инженер-проектировщик КИПиА
 
Регистрация: 30.08.2008
Минск
Сообщений: 159


ну это смотря что в том файле, у меня это вроде темплейта со стилями текста -> размеров, мультилидеров, таблиц, может быть слоев, типов линий и т.п.
kakt00z вне форума  
 
Непрочитано 18.11.2014, 09:59
#2339
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


Приветствую!

ПРошу подсказать пути решения.
Если последним объектом в чертеже является блок с атрибутами, к примеру, "AN_1", и его запоминаем по ENTLAST, добавляем новые объекты в чертеж, а потом "вдруг" обнаруживаем появление дополнительных объектов - атрибутов последнего блока ("AN_1"). Как с этим бороться?
Пока придумал такое - вставлять любой текстовый объект, после выполнения программы его удалять.
Frigate вне форума  
 
Непрочитано 18.11.2014, 10:37
#2340
Кулик Алексей aka kpblc
Moderator

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


А этот блок вставляется руками или программно? Если программно, то получить указатель именно на него вообще не вопрос.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум 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