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

Вернуться   Форум 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.
Просмотров: 1972278
 
Непрочитано 13.10.2021, 15:20
#4081
Кулик Алексей aka kpblc
Moderator

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


Сначала добейся, чтобы vla-offset (или что там на самом деле, не помню) нормально срабатывала. А потом уже можно хоть entlast сравнивать с предыдущим примитивом.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.10.2021, 09:48
#4082
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,679


Цитата:
Сообщение от megabeton Посмотреть сообщение
Есть код примерно такого содержания
megabeton, а какова самая конечная цель кодирования?
koMon вне форума  
 
Непрочитано 14.10.2021, 13:43
#4083
megabeton


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


Хочу отбить площадь полилинии в "идеальном" месте внутри полилинии. Методом лучевого траассирования точка внутри не всегда получается в "идеальном" месте, может оказаться близко к краю. Если реализовать идею с подобием, неважно, какой изначальной формы полилиния, после подобия внутрь она будет стремится к упрощению формы и одновременно будет стремиться к "идеальному" центру. Иногда, после подобия это будут несколько полилиний, соответственно нам надо только выбрать наибольшую по площади и дальше офсетить.
Вот в конце получается ситуация, при которой офсет невозможен, и при этом программа не возвратила ни nil, ни T. Хотел понять, как это обойти, чтобы продолжить выполнения кода. Я так понимаю vl-catch поможет, пока правда не пробовал, руки не дошли.
Сама конструкция кода неверная, привел для простого примера, такую вещь через while, а не через if надо реализовывать, но конечный затык в виде сообщения об ошибке идентичен.
Если не лень, буду благодарен за любую посильную помощь в достройке кода

----- добавлено через ~22 мин. -----
Цитата:
Сообщение от koMon Посмотреть сообщение
megabeton, а какова самая конечная цель кодирования?
Стоп, или это был философский вопрос, примерно как про смысл жизни?)
megabeton вне форума  
 
Непрочитано 14.10.2021, 14:34
#4084
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,679


нет, это был не философский вопрос))))
а если по-простецки, через штриховку?
koMon вне форума  
 
Непрочитано 14.10.2021, 14:45
#4085
megabeton


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


Цитата:
Сообщение от koMon Посмотреть сообщение
а если по-простецки, через штриховку?
Это как? Центр штриховки может лежать за пределами границ полилинии. Или я не понимаю?
megabeton вне форума  
 
Непрочитано 14.10.2021, 14:56
#4086
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,679


может. это я видимо не догнал. автоматом "отбить" площадь?
koMon вне форума  
 
Непрочитано 14.10.2021, 15:02
#4087
megabeton


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


Да, автоматом. В смысле извлечения площади полилинии и отбивки ее автоматом проблемы нет. Тут именно реализация определения точки вставки через офсет интересна.

----- добавлено через ~11 мин. -----
Нечто такое
(while
(vla-offset (vlax-ename->vla-object (entlast)) -50)
(добавить в набор (entlast))
(после сообщения об ошибке в центре последней полилинии отбей точку)
)
(удалить элементы набора)

Последний раз редактировалось megabeton, 14.10.2021 в 15:31.
megabeton вне форума  
 
Непрочитано 14.10.2021, 15:36
#4088
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,679


офсет внутрь (отрицательное смещение) определяется ещё и направлением следования вершин плинии. против часовой - внутрь, по часовой - наружу.
koMon вне форума  
 
Непрочитано 14.10.2021, 15:56
#4089
megabeton


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


Да да, я в курсе, направление изменяемо, это не проблема. Плтуллс от VVA тут очень помогает, спасибо ему

----- добавлено через ~12 мин. -----
Собственно вопрос, while реагирует на nil, однако (vla-offset (vlax-ename->vla-object (entlast)) -50) на последней стадии выдаст ошибку и остановит дальнейшее выполнение всего кода.
Как правильно и во что обернуть (vla-offset (vlax-ename->vla-object (entlast)) -50), чтобы выдало в конце nil, а не ошибку?

Последний раз редактировалось megabeton, 14.10.2021 в 16:09.
megabeton вне форума  
 
Непрочитано 14.10.2021, 16:30
1 | #4090
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,679


Код:
[Выделить все]
 (setq pline_object (vlax-ename->vla-object (car (entsel)))
	  pline_object+1 (car (vlax-safearray->list (vlax-variant-value (vla-offset pline_object 1))))
	  offset_value 0
	  offset_stepping 5
	  offset_direction (if (> (vla-get-area pline_object+1) (vla-get-area pline_object)) -1 1)
)
(vla-erase pline_object+1)
(while (null (vl-catch-all-error-p (setq offset_variant (vl-catch-all-apply 'vla-offset (list pline_object (* offset_direction (setq offset_value (+ offset_value offset_stepping))))))))
	(foreach offsetted_pline (vlax-safearray->list (vlax-variant-value offset_variant))
		(setq raw_coordinates (vlax-get offsetted_pline 'coordinates))
		(vla-erase offsetted_pline)
	)
)
(setq index 0
	  area_x 0
	  area_y 0
)
(repeat (/ (length raw_coordinates) 2)
	(setq area_x (+ area_x (nth index raw_coordinates))
		  area_y (+ area_y (nth (1+ index) raw_coordinates))
		  index (+ index 2)
	)
)
(command "_point"  (trans (list (/ area_x (/ (length raw_coordinates) 2)) (/ area_y (/ (length raw_coordinates) 2))) 0 1))
точка в центроиде последнего получившегося офсета

Последний раз редактировалось koMon, 14.10.2021 в 16:57.
koMon вне форума  
 
Непрочитано 14.10.2021, 17:56
#4091
megabeton


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


koMon испытал, супер! Пошел изучать код. Спасибо!
megabeton вне форума  
 
Непрочитано 18.10.2021, 18:45
#4092
megabeton


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


Вопрос про отличие блоков, созданных разными способами.
Ситуация №1:
Создал блок с помощью
Код:
[Выделить все]
 
(command "_copybase" (getpoint) (car (entsel)) "")
(command "_pasteblock" (getpoint))
Добавляю в него точку
Код:
[Выделить все]
 
(vla-addpoint 
	(vla-item 
		(vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) 
		(vla-get-effectivename (vlax-ename->vla-object (car (entsel))))
	)
	(vlax-3d-point 0. 0. 0.)
)
Результат – точка добавилась в точку вставки блока и на чертеже совпадает с
Код:
[Выделить все]
 (cdr (assoc 10 (entget (car (entsel)))))
Ситуация №2
Создал блок через vla-copyobjects (взято отсюда https://forum.dwg.ru/showthread.php?t=76304)
Код:
[Выделить все]
 (setq
	pt	(getpoint)
	ss	(mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
	blk	(vla-add (vla-get-blocks adoc) (vlax-3d-point pt) bname)
)
(vla-copyobjects
	adoc
	(vlax-make-variant 
		(vlax-safearray-fill 
			(vlax-make-safearray 
				vlax-vbobject 
				(cons 0 (1- (length ss)))
			)
			ss
		)
	)
	blk
)
(vla-insertblock
	(vla-objectidtoobject adoc (vla-get-ownerid (car ss)))
	(vlax-3d-point pt)
	(vla-get-name blk)
	1.0
	1.0
	1.0
	0.0
)
Добавляю также в него точку
Код:
[Выделить все]
 
(vla-addpoint 
	(vla-item 
		(vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) 
		(vla-get-effectivename (vlax-ename->vla-object (car (entsel))))
	)
	(vlax-3d-point 0. 0. 0.)
)

Результат – точка вставилась на чертеже в начало координат, а не в место вставки блока.
Почему в одном случае (vlax-3d-point 0. 0. 0.) вставляет точку в точку вставки блока, а в другом в начало координат?
Что нужно добавить в код к vla-copyobjects, чтобы он вел себя как при "_pasteblock"
Заметил, что у первого блока в свойствах указано "Единицы блока - миллиметры", у второго "Единицы блока - безразмерный".
megabeton вне форума  
 
Непрочитано 20.10.2021, 06:58
#4093
Vladimir_Sergeevich

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


немного к предыдущей теме.
Цитата:
Сообщение от megabeton Посмотреть сообщение
Разобрался что к чему (пост 4071). Направление задается от начала МСК, далее параллельным переносом уже определяем направление в искомой точке
Разве от начала мск? Всегда понимал как единичный вектор и использовал примерно в таком контексте: (angle pt_end_n (mapcar '+ pt_end_n (vlax-curve-getFirstDeriv curve-os (vlax-curve-getParamAtPoint curve-os pt_end_n)))), получая угол относительно МСК и уже дальше по углам определял что мне надо. тут pt_end_n - точка на кривой
В результате я определял положение точки относительно оси (криволинейной) таким куском кода:
Код:
[Выделить все]
 	(if	
		(or 
			(equal (angle pt_end pt_end_n) (- (angle pt_end_n (mapcar '+ pt_end_n (vlax-curve-getFirstDeriv curve-os (vlax-curve-getParamAtPoint curve-os pt_end_n)))) (* pi 0.5)) 0.1) 
			(equal (angle pt_end pt_end_n) (+ (angle pt_end_n (mapcar '+ pt_end_n (vlax-curve-getFirstDeriv curve-os (vlax-curve-getParamAtPoint curve-os pt_end_n)))) (* pi 1.5)) 0.1) 
		) 
		(setq is_right "слева") (setq is_right "справа")
	)
В случаях когда мне надо это использовать дальше по коду, вместо строк использовались t/nil

По текущему вопросу:
Цитата:
Сообщение от megabeton Посмотреть сообщение
Результат – точка вставилась на чертеже в начало координат, а не в место вставки блока.
У меня поведение совпадает, vla-addPoint ставит точку внутрь описания в координату 0,0,0, которая по умолчанию считается точкой вставки.
Может, каким то невероятным образом, во втором случае базовая точка блока отличается от начала координат блока?
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Непрочитано 22.10.2021, 05:04
#4094
gumel


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


Подскажите, есть ли изящный способ понять направление обхода по трём точкам? Пользователь указывает три точки на плоскости. Мне нужно понимать направление, - по часовой или против?.

Стоит задача вычислить точки Ферма-Торричелли в произвольном треугольнике. Алгоритм довольно простой и тестовый алгоритм у меня работает, но только в тех случаях когда точки указываются по часовой стрелке. Код пока такой:
Код:
[Выделить все]
 
(defun C:TRP ()
  ; точки треугольника (важно указывать по часовой стрелке)
  (setq P1 (getpoint "\n >Укажите точку 1: "))
  (setq P2 (getpoint "\n >Укажите точку 2 (в направлении по часовой стрелке): "))
  (setq P3 (getpoint "\n >Укажите точку 3 (в направлении по часовой стрелке): "))

  ; исходный треугольник
  ;(command "_LINE" P1 P2 P3 "_C")

  ; длины сторон
  (setq L12 (distance P1 P2))
  (setq L23 (distance P2 P3))
  (setq L31 (distance P3 P1))

  ; углы наклона
  (setq Ang12 (angle P1 P2))
  (setq Ang23 (angle P2 P3))
  (setq Ang31 (angle P3 P1))

  ; потивоположные точки
  (setq P12 (polar P1 (+ Ang12 (/ PI 3)) L12))
  (setq P23 (polar P2 (+ Ang23 (/ PI 3)) L23))
  (setq P31 (polar P3 (+ Ang31 (/ PI 3)) L31))

  ; искомые линии
  (command "_LINE" P12 P3 "")
  (command "_LINE" P23 P1 "")
  (command "_LINE" P31 P2 "")

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

--------------
update

сделал через скалярное произведение

Код:
[Выделить все]
 
....     
  ; определим координаты точек
  (setq x1 (nth 0 P1) y1 (nth 1 P1)
	x2 (nth 0 P2) y2 (nth 1 P2)
	x3 (nth 0 P3) y3 (nth 1 P3))

  ;  Result := (P2.X - P1.X) * (P3.Y - P1.Y) >= (P2.Y - P1.Y) * (P3.X - P1.X); - формула для определения направления по часовой или против (если true то против)
  (if  (>= (* (- x2 x1) (- y3 y1))
	   (* (- y2 y1) (- x3 x1)))
          ; если условие меняется, то нужно поменять местами P2 и P3
	   (setq tmpP P2
		 P2 P3
		 P3 tmpP))
 ....

Последний раз редактировалось gumel, 22.10.2021 в 07:27.
gumel вне форума  
 
Непрочитано 11.11.2021, 14:38
#4095
Sege


 
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 107


Что-то под конец рабочей недели запутался с формированием списков

Допустим есть список (setq A '("1A" "2A")) и на на выходе получаем ("1A" "2A")
есть другой список (setq B '("1B" "2B")) и на на выходе получаем ("1B" "2B")

Есть промежуточная итерация объединения списков (setq nabor (list A B)), на выходе получаем (("1A" "2A") ("1B" "2B"))

Далее нужно в уже сформированный список nabor добавить дополнительное значение из новой переменной (setq С '("3A" "3B"))
(setq nabor (list nabor C))
но на выходе получаем вложенный список ((("1А" "1B") ("2A" "2B")) ("3A" "3B"))

Как сделать чтобы получился список для переменной nabor без учета вложенности (("1A" "1B") ("2A" "2B") ("3A" "3B"))

Последний раз редактировалось Sege, 11.11.2021 в 15:35.
Sege вне форума  
 
Непрочитано 11.11.2021, 16:05
1 | #4096
Кулик Алексей aka kpblc
Moderator

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


(append (list a b) (list c))
(cons c (list a b))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.12.2021, 23:11
#4097
megabeton


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


Подскажите, а есть простой способ удалить вершину полилинии средствами Activex, подобный vla-AddVertex, ну что то типа vla-RemoveVertex или там vla-DeleteVertex
megabeton вне форума  
 
Непрочитано 10.12.2021, 23:38
#4098
Сергей812


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


Цитата:
Сообщение от megabeton Посмотреть сообщение
Подскажите, а есть простой способ удалить вершину полилинии средствами Activex, подобный vla-AddVertex, ну что то типа vla-RemoveVertex или там vla-DeleteVertex
в явном виде метода нет. Как реализовать - можно посмотреть в этой теме, например - команда Pl-VxDel

----- добавлено через ~10 мин. -----
в том же ObjectArx/.Net есть метод RemoveVertexAt, но в ActiveX его решили не "вытаскивать" в публичные методы, видимо
Сергей812 вне форума  
 
Непрочитано 05.01.2022, 14:46
#4099
shishoq


 
Регистрация: 23.01.2005
spb
Сообщений: 120


всех с новым годом однако!

теперь вопрос.
хочу ткнуть мышкой в экран и получить простенький текст с координатами ткнутой точки.
соорудил следующее:

(command "text" (setq TT (getpoint)) 1 0 TT)

получаю:

205.385389406629,27.86316521445838

по-моему первый раз, когда акад по доброй воле показал ТОЧНЫЕ координаты ))), но мне столько не надо!
Есть ли какая (не)общая переменная, определяющая точность вещ.чисел? (я верну!) -- мне 1-2 цифры после запятой хватило бы. -- просто не хочется rtos-ить, разбивать список на части и клеить обратно... хоцца както шоб логичнее было, стройнее...
(искал-ненашол ))

Последний раз редактировалось shishoq, 05.01.2022 в 22:17.
shishoq вне форума  
 
Непрочитано 06.01.2022, 14:23
#4100
Кулик Алексей aka kpblc
Moderator

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


luprec ?
__________________
Моя библиотека 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