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

Вернуться   Форум 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.
Просмотров: 1965696
 
Непрочитано 15.11.2010, 16:20
1 | #1161
Лиспер


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


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

(defun test (/ ent center)
  (if (= (type (setq ent (vl-catch-all-apply
                           (function
                             (lambda ()
                               (vlax-ename->vla-object (ssname (ssget "_+.:S:E" '((0 . "REGION"))) 0))
                               ) ;_ end of lambda
                             ) ;_ end of function
                           ) ;_ end of vl-catch-all-apply
                     ) ;_ end of setq
               ) ;_ end of TYPE
         'vla-object
         ) ;_ end of =
    (setq center (vlax-safearray->list (vlax-variant-value (vla-get-centroid ent))))
    ) ;_ end of if
  center
  ) ;_ end of defun
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 15.11.2010, 16:33
#1162
E-degtyarev

Помогаю, кому делать нечего.
 
Регистрация: 27.03.2009
Русская деревня
Сообщений: 394


Лиспер, Огромное спасибо!
E-degtyarev вне форума  
 
Непрочитано 16.11.2010, 07:31
#1163
Frigate

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


TararykovDG,

ты был прав. Я разобрался с sssetfirst. Очень полезная команда.

Подскажите пожалуйста, возможно ли при помощи ЛИСП выбрать папку, а не файл в папке (по getfiled или еще может какие команды есть) ?
Сейчас мне приходится выбирать любой файл в папке, чтобы "подхватить" из этого выбора путь папки. А хочется, чтобы только папки показывало окно выбора, без файлов.

Последний раз редактировалось Frigate, 16.11.2010 в 07:36.
Frigate вне форума  
 
Непрочитано 16.11.2010, 08:02
#1164
Лиспер


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


http://forum.dwg.ru/showthread.php?t=16560 ?
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 16.11.2010, 08:44
#1165
E-degtyarev

Помогаю, кому делать нечего.
 
Регистрация: 27.03.2009
Русская деревня
Сообщений: 394



Frigate,
Попробуй такую функцию, может сгодится?
Код:
[Выделить все]
(defun GetFolder (/ Dir Item Path)
 (cond
  ((setq Dir (vlax-invoke (vlax-get-or-create-object "Shell.Application") 'browseforfolder 0 "Выберите папку с DWG файлами:" 1 ""))
   (cond
    ((not (vl-catch-all-error-p (vl-catch-all-apply 'vlax-invoke-method (list Dir 'Items))))
     (setq Item (vlax-invoke-method (vlax-invoke-method Dir 'Items) 'Item))
     (setq Path (vla-get-path Item))
     )
   );end cond
  )
 );end cond
 Path
);end GetFolder
E-degtyarev вне форума  
 
Непрочитано 16.11.2010, 09:00
#1166
sanya V


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


Доброго времени суток!
Вот такой вопрос:
почему такой код

(entmake (list '(0 . "TEXT")
'(10 216422.0 22222.09 0.0)
'(40 . 150.0)
'(1 . "X")
'(71 . 0)
'(72 . 0)
'(73 . 0)))

(entmake (list '(0 . "TEXT")
'(10 222422.0 22222.09 0.0)
'(40 . 150.0)
'(1 . "XY")
'(71 . 0)
'(72 . 1)
'(73 . 0)))

исполняется так:

"Х" отображается по координате (216422.0 22222.09 0.0), а
"XY" по координате (0.0 0.0 0.0), а не по (222422.0 22222.09 0.0)?
sanya V вне форума  
 
Непрочитано 16.11.2010, 09:13
#1167
Лиспер


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


http://autolisp.ru/2010/04/06/text-and-attrib-entities/
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 16.11.2010, 10:02
#1168
sanya V


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


Пасибки!
засада, значит
sanya V вне форума  
 
Непрочитано 16.11.2010, 10:17
#1169
Лиспер


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


Почему засада? Просто надо не только 10, но и 11 группу устанавливать - вот и все дела.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 16.11.2010, 10:21
#1170
sanya V


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


Двойное "пасибки"!
Я не профи, только учусь (проектировщик)
Работает!!!
sanya V вне форума  
 
Непрочитано 16.11.2010, 12:24
#1171
Frigate

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


E-degtyarev,

о, спасибо большое!!! ТО, чот нужно!

а есть возможность по браузеру выбирать и файлы? Чтобы у меня вид окон был одинаков для папок и для файлов.

Никак не могу еще один вопрос решить - тормозит автокад и все тут, даже виснет.

Подскажите, пожалуйста, как можно в таблице все границы между ячейками сделать толщиной 0,4?

Пробовал вот такой код:

Код:
[Выделить все]
 
(defun C:test ()
(vl-load-com)
(setq ent   (vlax-ename->vla-object (car (entsel "\nВыбрать таблицу : "))) 
            ) ;_ end of setq 
(vla-setcellgridlineweight
 ent
        5 ;можно использовать переменную-счетчик рядов
        3 ;можно использовать переменную-счетчик колонок
        (+ acleftmask acrightmask)
        aclnwt040
        ) ;_ end of vla-SetCellGridLineWeight
)
С одной ячейкой вполне нормально работает.
Но если этот код применить в цикле и ко многим ячейкам, то автокад просто виснет... что-то не так делаю. Прошу поделиться ссылкой или код, как массово менять толщину границ ячеек
Заранее благодарен.

Последний раз редактировалось Frigate, 16.11.2010 в 14:47.
Frigate вне форума  
 
Непрочитано 17.11.2010, 09:11
#1172
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Цитата:
Сообщение от Frigate Посмотреть сообщение
Подскажите, пожалуйста, как можно в таблице все границы между ячейками сделать толщиной 0,4?
Если вес линий нужно поменять для всех ячеек, а не для каких-то отдельных, то вместо vla-setcellgridlineweight в цикле для каждой ячейки попробуй использовать vla-SetGridLineWeight для всей таблицы.
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 17.11.2010, 15:25
#1173
Frigate

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


TararykovDG,

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

И чтобы этот код не тормозил, как у меня происходило. В итоге пришлось просто создать шаблон таблицы. Но ведь хочется самому иметь возможность подправить таблицу - вернее, выбранный диапазон ячеек.
Frigate вне форума  
 
Непрочитано 17.11.2010, 16:55
#1174
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Цитата:
Сообщение от Frigate Посмотреть сообщение
Но если этот код применить в цикле и ко многим ячейкам, то автокад просто виснет...
Frigate, а какая размерность таблицы. Дело в том, что большая таблица сама по себе уже жрет много системных ресурсов, например при попытке создания таблицы 50х40 акад говорит что "В таблице больше 2000 ячеек..." ну и что мол будет тратиться много системных ресурсов

У меня для таблицы 30х30 при модификации ячеек с 1 по 20 по столбцам и с 1 по 25 по строкам затратилось примерно 17 секунд. Какие у Тебя результаты?
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 17.11.2010, 18:35
#1175
Frigate

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


TararykovDG,

я когда игрался с таблицами, задавал в цикле, чтобы вертик. границы 8 ячеек стали толстыми. Очень сильно тупил АКАд, пока не щалкнешь мышкой, он так и висит, а как щелкнешь - задумается и все-таки родит - сделает вертик. границы толстыми. Щас попробую-ка еще разок

Проверил. В общем в прошлый раз я что-то напутал в коде.
Таблица 30 на 30. Задавал вертик. границы первым 25 строкам, всем 30 столбцам. Примерно 20-25 секунд выполнялось.

ВОт код:

Код:
[Выделить все]
(tbl 1 1 25 30)

(defun tbl (1row 1col row col /  ent i j)
(setq ent   (vlax-ename->vla-object (car (entsel "\nВыбрать таблицу : ")))) ;_ end of setq 
(setq 	i (1- 1row) 
	j (1- 1col)
)
(repeat (1- col)
(repeat (1- row)
(vla-setcellgridlineweight
	ent
        i ;можно использовать переменную-счетчик рядов
        j ;можно использовать переменную-счетчик колонок
        (+ acleftmask acrightmask)
        aclnwt040
) ;_ end of vla-SetCellGridLineWeight
(setq i (1+ i))
);end repeat
(setq j (1+ j))
(setq i 0)
);end repeat
);_end of defun

Последний раз редактировалось Frigate, 17.11.2010 в 19:29.
Frigate вне форума  
 
Непрочитано 17.11.2010, 21:06
#1176
Nikolay 2


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


Цитата:
Сообщение от Frigate Посмотреть сообщение
Таблица 30 на 30. Задавал вертик. границы первым 25 строкам, всем 30 столбцам. Примерно 20-25 секунд выполнялось.
Аналогичная таблица, код отработал за 15 сек
Nikolay 2 вне форума  
 
Непрочитано 17.11.2010, 23:38
#1177
Кулик Алексей aka kpblc
Moderator

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


Почему-то в AutoCAD 2011 Rus 64 bit отказывается обрабатывать последние две строки. Хотя должно...
Код:
[Выделить все]
(vl-load-com)

(defun test (/ tbl col_count row_count err)
  (if (= (type (setq tbl (vl-catch-all-apply
                           (function
                             (lambda ()
                               (vlax-ename->vla-object (ssname (ssget "_+.:S:E" '((0 . "ACAD_TABLE"))) 0))
                               ) ;_ end of lambda
                             ) ;_ end of function
                           ) ;_ end of vl-catch-all-apply
                     ) ;_ end of setq
               ) ;_ end of type
         'vla-object
         ) ;_ end of =
    (progn
      (vla-put-regeneratetablesuppressed tbl :vlax-true)
      (setq col_count 0
            row_count 0
            ) ;_ end of setq
      (repeat (vla-get-columns tbl)
        (repeat (+ (if (equal (vla-get-titlesuppressed tbl) :vlax-false)
                     1
                     0
                     ) ;_ end of if
                   (vla-get-rows tbl)
                   ) ;_ end of +
          (if (vl-catch-all-error-p
                (setq err (vl-catch-all-apply
                            (function
                              (lambda ()
                                (vla-setcellgridlineweight tbl col_count row_count (+ acleftmask acrightmask) aclnwt211)
                                ) ;_ end of lambda
                              ) ;_ end of function
                            ) ;_ end of vl-catch-all-apply
                      ) ;_ end of setq
                ) ;_ end of vl-catch-all-error-p
            (princ (strcat "\n Col: "
                           (itoa col_count)
                           " row: "
                           (itoa row_count)
                           "; err: "
                           (vl-catch-all-error-message err)
                           ) ;_ end of strcat
                   ) ;_ end of princ
            ) ;_ end of if
          (setq row_count (1+ row_count))
          ) ;_ end of repeat
        (setq row_count 0
              col_count (1+ col_count)
              ) ;_ end of setq
        ) ;_ end of repeat
      (vla-put-regeneratetablesuppressed tbl :vlax-false)
      (vla-update tbl)
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.11.2010, 15:56
#1178
Frigate

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


Уважаемые гуру,

подскажите пожалуйста, как сделать такой вариант запроса:

"Укажите точку вставки перечня кабелей [1 - указать количество столбцов самому]:"

Т.е. чтобы по умолчанию пользователь мог ввести точку, но в то же время, при желании, мог ввести единицу (или букву, напр.).

Типа как в автокадовскиъ командах, когда можно ввести следующую точку, но можно поменять настройки, ввести численно длину и тп.
Frigate вне форума  
 
Непрочитано 18.11.2010, 16:28
#1179
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Код:
[Выделить все]
(initget 1 "0 1 2") ; запретили пустой ввод (Enter), можно указать точку или ввести один из разрешенных (0 1 2) символов
(getpoint "\n Укажите точку вставки перечня кабелей или [0 - Указать количество столбцов самому/1 - Попросить соседа/2 - Забить на все и идти пить пиво]: ") ; вернет точку вставки (если укажешь на экране) или один из символов "0", "1" или "2"
При запросе указываешь точку или вводишь разрешенный символ или правой кнопкой мыши и выбираешь из контексного меню.
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 18.11.2010, 17:28
#1180
Frigate

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


TararykovDG,

а как быть, если надо не просто указать точку, но и визуализировать движения курсора при помощи grread?

Я через grread щас домучал автокад и в итоге вот что получил:

Код:
[Выделить все]
(defun C:pnt ( / flag flag2 pt pt2 gr default_column_num)
(setq flag T)
(setq default_column_num 1)
(setq flag2 T)
(setq pt (getpoint "\nУкажите начальную точку:"))

(PRINC "\nУкажите точку вставки перечня кабелей или [1-указать количество столбцов]:")
(while flag
(setq gr (grread t 3))
(redraw)
(if (= (car gr) 5) (grdraw pt (cadr gr) 1 1) )
(COND
;===первое условие
	(
		(equal gr '(2 49))
(PROGN
(PRINC (vl-princ-to-string gr))
(setq flag2 T)
(while flag2
	(if   (not (setq column_num
  		 (getint    (strcat "\nУкажите число столбцов <" 
		(itoa default_column_num) ">: "))))
	(setq column_num default_column_num)
                  )

	(if (<= column_num 0 )
		(PRINC "\nНужно ввести целое число больше нуля!")
		(setq flag2 nil)
	)
)
(setq flag nil)
);_end PROGN 
	)
;===второе условие
	(
		(= (car gr) 3)
(PROGN
(setq pt2 (cadr gr))
(PRINC (vl-princ-to-string gr))
(setq flag nil)
);_end PROGN
	)
);_end COND
);_end while  

);_end defun
Frigate вне форума  
Ответ
Вернуться   Форум 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