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

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

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

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

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (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.
Просмотров: 1670015
 
Непрочитано 09.11.2020, 15:28
#3941
koMon


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


без activex вряд ли(
koMon вне форума  
 
Непрочитано 09.11.2020, 15:33
#3942
megabeton


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


Тогда сразу вопрос - а как указать на пространство блока?
??? vla-get-ModelBLOCK ??? (vla-get-ModelSpace (vla-get-activedocument (vlax-get-acad-object)))
Совсем чайник пока в Активексе, дайте наводку.
megabeton вне форума  
 
Непрочитано 09.11.2020, 15:35
#3943
koMon


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


это просто указатель на не/именованный блок из коллекции блоков
koMon вне форума  
 
Непрочитано 09.11.2020, 15:36
1 | #3944
Кулик Алексей aka kpblc
Moderator

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


http://www.cad.dp.ua/stats/vla_doc.php
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.11.2020, 15:18
#3945
megabeton


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


Добавить точку (линию, текст и пр.) в пространство модели - просто.
(vla-addPOINT (vla-get-ModelSpace (vla-get-activedocument (vlax-get-acad-object))) (vlax-3D-point '(0. 0. 0.)))
Применяем метод и передаем соответствующие аргументы.

Добавить точку в блок пока не получается.
(vla-addPOINT (vla-get-Blocks (vla-get-activedocument (vlax-get-acad-object)) (vlax-ename->vla-object (car (entsel)))) (vlax-3D-point '(0. 0. 0.)))
ошибка: Слишком много фактических параметров

По логике дилетанта рассуждаю следующим образом.
Использую метод vla-addPOINT, указываю на блок (делаю запрос свойства vla-get-Blocks с аргументом объект, т.е. конкретный блок) в пространстве модели/документа/объекта и передаю аргумент "координаты точки". Где ошибка?
megabeton вне форума  
 
Непрочитано 10.11.2020, 15:55
1 | #3946
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
 (vla-addpoint (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
                        (vla-get-effectivename (vlax-ename->vla-object (car (entsel))))
              ) ;_ end of vla-item
              (vlax-3d-point '(0. 0. 0.))
) ;_ end of vla-addpoint
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.12.2020, 18:47
#3947
proel


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


... прошу удалить мой вопрос как уже не актуальный.

Последний раз редактировалось proel, 26.12.2020 в 21:15.
proel вне форума  
 
Непрочитано 25.12.2020, 21:48
#3948
Browning Zed


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


Господа, подскажите, как из ssget получить набор, к которому можно обращаться через vla-функции? Например, получаем набор выбора:
Код:
[Выделить все]
 (setq ss   (ssget '((0 . "LWPOLYLINE"))))
Далее, преобразуем его, и записываем в переменную X, чтобы после появилась возможность изменять свойства объектов:
Код:
[Выделить все]
 (vla-put-color X 1)
 (vla-put-linetype X "Continuous")
и т.д.
Browning Zed вне форума  
 
Непрочитано 25.12.2020, 22:04
1 | #3949
skkkk


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


Код:
[Выделить все]
 (setq ss (ssget '((0 . "LWPOLYLINE"))))
(if ss
	(repeat (setq i (sslength ss))
		(setq X (vlax-ename->vla-object (ssname ss (setq i (1- i)))))
		(vla-put-color X 1)
		(vla-put-linetype X "Continuous")
	)
)
skkkk вне форума  
 
Непрочитано 25.12.2020, 22:12
#3950
Browning Zed


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


Спасибо.

----- добавлено через ~11 ч. -----
Как присвоить объектам RGB цвет через vla?
Код:
[Выделить все]
 (setq ss (ssget '((0 . "LWPOLYLINE"))))
(if ss
	(repeat (setq i (sslength ss))
		(setq X (vlax-ename->vla-object (ssname ss (setq i (1- i)))))
		(vla-put-truecolor X (list '(255 255 255))); белый цвет
	)
)
Вместо (list '(255 255 255)), насколько я понимаю, нужно сослаться на какой-то объект, имеющий соответствующий цвет. Но как это сделать?

Последний раз редактировалось Browning Zed, 26.12.2020 в 09:43.
Browning Zed вне форума  
 
Непрочитано 28.12.2020, 18:24
#3951
Сет


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


Подскажите, как нарисовать простую полилинию по двум вершинам?
Пробую вот такой код:
Код:
[Выделить все]
 
(setq pt1 (list 1 1))
(setq pt2 (list 2 2))
(vla-AddPolyline model_space (vlax-safearray-fill 
    (vlax-make-safearray vlax-vbDouble '(0 . 1))
    (append pt1 pt2)))
Здесь model_space - указатель на пространство модели.
В итоге получаю ошибку:
Цитата:
сбой функции vlax-safearray-fill. Неверный список инициализации. #<safearray...>
Сет вне форума  
 
Непрочитано 28.12.2020, 18:44
1 | #3952
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
 (setq *model* (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))))
(setq p1 (list 1. 1.))
(setq p2 (list 2. 2.))
(vla-addlightweightpolyline *model*
                            (vlax-make-variant (vlax-safearray-fill (vlax-make-safearray vlax-vbdouble '(0 . 3)) (append p1 p2))
                            ) ;_ end of vlax-make-variant
) ;_ end of vla-AddLightWeightPolyline
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.12.2020, 20:39
#3953
Сет


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


Кулик Алексей aka kpblc, а почему в функции vlax-make-safearray указана точечная пара (0 . 3), а не (0 . 1), как у меня? Я так понимаю, это значения индексов первого и последнего элементов массива. Если всего этих элементов два (две точки-вершины полилинии), то зачем мне массив на 4 элемента, который создается с помощью точечной пары (0 . 3)? Или координаты двухмерной точки в массиве занимают две позиции?
Сет вне форума  
 
Непрочитано 28.12.2020, 21:47
#3954
Кулик Алексей aka kpblc
Moderator

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


Потому что вершин 2, у каждой по 2 координаты. Итого 4 элемента. От 0 до 3.

----- добавлено через 13 сек. -----
И не забудь преобразовать savearray в variant.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.12.2020, 09:33
1 | #3955
koMon


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
И не забудь преобразовать savearray в variant.
это точно будет лишнее.

----- добавлено через ~4 мин. -----
Цитата:
Сообщение от Сет Посмотреть сообщение
а почему в функции vlax-make-safearray указана точечная пара (0 . 3), а не (0 . 1), как у меня?
определяется одномерный массив на 4 члена (первый член будет иметь индекс в массиве 0, последний 3), в который затем загоняются поочерёдно координаты X, Y вершин полилинии. 2 вершины 4 члена, 3 - 6, ....

----- добавлено через ~10 мин. -----
Цитата:
Сообщение от Browning Zed Посмотреть сообщение
Как присвоить объектам RGB цвет через vla?
если назначать цвет, использую ActiveX, то и выбор объектов лучше имхо делать на нём же и быстрее работать будет и проще к объектам выборки обращаться. например назначить всем выбранным полилиниям цвет R255G255B255 можно так.
Код:
[Выделить все]
 
(setq filter_list '((0 . "LWPOLYLINE"))
	  group_code_array (vlax-make-safearray vlax-vbinteger (cons 0 (1- (length filter_list))))
	  group_value_array (vlax-make-safearray vlax-vbvariant (cons 0 (1- (length filter_list))))
	  array_index 0
	  color_object (vlax-create-object (strcat "AutoCAD.AcCmColor." (substr (getvar "ACADVER") 1 2)))
)
(vla-setrgb color_object 255 255 255)		;устанавлbваем RGB цвет для назначения его выбранным полилиниям
(if (null (vl-catch-all-error-p (vl-catch-all-apply 'vla-item (list (vla-get-selectionsets (vla-get-activedocument (vlax-get-acad-object))) "Pline_Collection"))))
		(vla-delete (vla-item (vla-get-selectionsets (vla-get-activedocument (vlax-get-acad-object))) "Pline_Collection"))
)
(repeat (length filter_list)
	(vlax-safearray-put-element group_code_array array_index (car (nth array_index filter_list)))
	(vlax-safearray-put-element group_value_array array_index (cdr (nth array_index filter_list)))
	(setq array_index (1+ array_index))
)
(setq pline_collection (vla-add (vla-get-selectionsets (vla-get-activedocument (vlax-get-acad-object))) "Pline_Collection"))
(vla-selectonscreen pline_collection group_code_array group_value_array)
(vlax-for every_pline pline_collection
	(vla-put-colormethod (vla-get-truecolor every_pline) acColorMethodByRGB)
	(vla-put-truecolor every_pline color_object)
)
(vla-delete (vla-item (vla-get-selectionsets (vla-get-activedocument (vlax-get-acad-object))) "Pline_Collection"))
(princ)

Последний раз редактировалось koMon, 29.12.2020 в 09:48.
koMon вне форума  
 
Непрочитано 29.12.2020, 16:16
#3956
Сет


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


Есть такая задача. Пользователь последовательно указывает три точки. При этом две первые точки задают прямую, а третья точка чаще всего не лежит на ней. Задача состоит в том, чтобы найти координаты точки p3', которая будет находиться на прямой, заданной точками p1 и p2 и максимально близко от точки p3. Есть простой, но трудоемкий способ через лобовые геометрические вычисления. Но может быть у лиспа есть функционал, который позволяет решить эту задачу проще? Или может кто-то для себя писал такую функцию под свои нужды?
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.png
Просмотров: 7
Размер:	8.4 Кб
ID:	233167  
Сет вне форума  
 
Непрочитано 29.12.2020, 16:29
#3957
Browning Zed


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


----- добавлено через 44 сек. -----
Цитата:
Сообщение от koMon Посмотреть сообщение
цвет R255G255B255 можно так
Спасибо большое! В очередной раз выручил, сенсей.
Browning Zed вне форума  
 
Непрочитано 29.12.2020, 16:43
1 | #3958
koMon


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


Цитата:
Сообщение от Сет Посмотреть сообщение
Есть такая задача.
если построить, например, вспомогательный отрезок, то искомая точка может быть найдена при помощи функции (VLAX-CURVE-GETCLOSESTPOINTTO).
хотя можно и используя (inters)
Код:
[Выделить все]
 (setq pt1 (getpoint "\n1-я точка: ")
	  pt2 (getpoint "\n2-я точка: ")
	  pt3 (getpoint "\n3-я точка: ")
	  pt3_12 (print (inters pt1 pt2 pt3 (polar pt3 (+ (* 0.5 pi) (angle pt1 pt2)) 5.0) nil))
)

Последний раз редактировалось koMon, 29.12.2020 в 16:50.
koMon вне форума  
 
Непрочитано 29.12.2020, 17:10
#3959
Сет


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


Цитата:
Сообщение от koMon Посмотреть сообщение
если построить, например, вспомогательный отрезок, то искомая точка может быть найдена при помощи функции (VLAX-CURVE-GETCLOSESTPOINTTO).
хотя можно и используя (inters)
А можно ли в моем примере получить еще две точки, лежащий на прямой p1-p2, на определенном расстоянии от точек p1 и p2 снаружи отрезка p1-p2? На картинке точки помечены красным. При этом нужно учитывать, что пользователь может задать точки в обратном порядке, то есть задать направление сверху вниз влево, а не снизу вверх вправо, как у меня на картинке.
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.png
Просмотров: 9
Размер:	10.1 Кб
ID:	233168  
Сет вне форума  
 
Непрочитано 04.01.2021, 11:35
#3960
Сет


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


Цитата:
Сообщение от Сет Посмотреть сообщение
А можно ли в моем примере получить еще две точки, лежащий на прямой p1-p2, на определенном расстоянии от точек p1 и p2 снаружи отрезка p1-p2?
Разобрался. С помощью функции polar.
Сет вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Vetcad
Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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