dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

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

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

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

Red Nova вне форума Вставить имя

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (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.
Просмотров: 1451675
 
Непрочитано 31.10.2017, 11:54
#3401
kurstep


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


Подскажите пожалуйста как выбрать на чертеже (с подсветкой на экране ) объект по vla- указателю ?
kurstep вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 31.10.2017, 12:04
1 | #3402
Кулик Алексей aka kpblc
Moderator

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


Подсветка с ручками или без? Если без, то vla-highlight в помощь. Если с ручками - то преобразовать vla в ename, добавить ename в набор и потом sssetfirst.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 02.11.2017, 11:04
#3403
Titli-pytli


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


Цитата:
Сообщение от VVA Посмотреть сообщение
Titli-pytli, polar?
Для пользователя читать про Относительные координаты в Автокаде
Это не то. Нужно получать координату непосредственно тыкая в пространстве автокада мышкой, вроде функции getpoint, но так, что бы последующее тыкание привязывалось к предыдущему (виртуальный отрезок между ними лежал вдоль главных координатных осяй или на заданных углах привязки) как при черчении отрезками (полилинией) при включенном динамическом вводе (F12) . Это нужно для раставления блоков между этими точками в цикле, после каждой новой указанной точки, не нанося при этом реальную линию.

И еще:
Почему функция (vlax-get-property obg "PrincipalDirections") возвращает одни и те же единичные вектора главных направлений для разных цилиндров (повернутых в разные направления вдоль главных координатных осей)?
Для цилиндра с осью вдоль оси X координаты векторов (1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0)
Для цилиндра с осью вдоль оси Y координаты векторов (1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0)
Не поверите, но вдоль оси Z тоже самое.
Как вообще узнать в каком направлении он повернут? Ну или может быть есть какой нибудь другой способ узнать координату конца цилиндра? Протыкал все примитивы в его составе, но так и не нашел.
Titli-pytli вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 08.11.2017, 15:40
#3404
Inferi


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


Доброго времени суток, может кто подскажет как преобразовать список вида:
'((1 3 2) (1 2) (6 4 5) (6 5)) -> '((1 3 2) (6 4 5))
По смыслу, если элемент списка содержится в другом списке, то удаляем элемент в сравниваемом списке
Inferi вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 08.11.2017, 16:15
#3405
Кулик Алексей aka kpblc
Moderator

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


В другом или в следующем?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 08.11.2017, 16:24
#3406
Inferi


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


Во всех последующих, список может быть длинней 4х:
'((25 50 100 300 200) (25 50 100 200) (25 50 100) (25 50) (700 600 400 500) (700 600 500) (700 600))

На выходе нужно получить максимально объединенные подсписки:
'((25 50 100 300 200)(700 600 400 500))
Inferi вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 08.11.2017, 16:42
#3407
Кулик Алексей aka kpblc
Moderator

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


Сильно хочется задать провокационный вопрос: а каков должен быть результат для списка

'((25 50 100 300 200) (25 50 100 200) (25 50 100 700 600) (25 50) (700 600 400 500) (700 600 200 25 500) (700 600))
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 08.11.2017, 17:11
#3408
Inferi


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


Список тот что я обрабатываю можно разделить на два: значения элементов подсписков первого списка уникальны, и не встречаются во втором подсписке. Возможно я все усложняю. Вообще исходные данные такие:
1. есть список уникальных координат, лежащих на полилиниях (отмечены красным на рисунке)
2. есть список наложенных полилиний
Половина уникальных координат встречается в каждой полилинии в своей половине списка. Мне нужно получить две группы полилиний, по признаку принадлежности к своей половине уникальных координат.

Я пробегался foreach по координатам полилиний, и с помощью member и vl-remove-if-not получил список с именами полилиний, но проблема в том что нужно список '((имя_полилинии1 имя_полилинии2 имя_полилинии3) (имя_полилинии2 имя_полилинии3) (имя_полилинии4 имя_полилинии5 имя_полилинии6) (имя_полилинии5 имя_полилинии6)) преобразовать в '((имя_полилинии1 имя_полилинии2 имя_полилинии3)(имя_полилинии4 имя_полилинии5 имя_полилинии6))
Миниатюры
Нажмите на изображение для увеличения
Название: Снимок.PNG
Просмотров: 21
Размер:	5.2 Кб
ID:	195469  

Последний раз редактировалось Inferi, 08.11.2017 в 17:17.
Inferi вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 10.11.2017, 19:40
#3409
Fedorino

автоматизация и организация черчения
 
Регистрация: 17.11.2009
Sterlitamak
Сообщений: 125


Здравствуйте!
Будьте добры, подскажите, как с помощью лиспа, при простановке размера, задавать длину выносных линий?
Т.е. иными словами как задавать отступ размерной линии от виртуальной прямой проходящей между двумя точками размера.
__________________
слесарь САПР
Fedorino вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 10.11.2017, 21:00
#3410
Setvar

Всего понемногу
 
Регистрация: 10.02.2007
Москва
Сообщений: 555


Я пользуюсь примерно такими кодами (выдрано из рабочей программы):
Код:
[Выделить все]
;;; Для горизонтального параллельного размера
;;; Нарисован, например, прямоугольник.
;;; Указываем левый нижний угол и правый нижний угол.
(defun C:FAR ( / osm dp1 dp2 dp3)
(setq osm (getvar "OSMODE"))
(setvar "OSMODE" 32) ;;; Пересечение
(setq dp1 (getpoint "\nПервая точка на объекте: "))
(setq dp2 (getpoint "\nВторая точка на объекте: "))
(setq dp12 (list (/ (+ (nth 0 dp1) (nth 0 dp2)) 2) (- (nth 1 dp1) 1000)))
(vl-cmdf "_DIMALIGNED" ""  "_m2P" dp1  dp2 dp12)
(setvar "OSMODE" osm)
(princ)
)
В данном случае точки указываются, но они могут быть вычислены в процессе автоматического построения объектов.
__________________
Установи FILEDIA в 1 и не парься.
Setvar вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 10.11.2017, 21:13
#3411
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Fedorino Посмотреть сообщение
как задавать отступ размерной линии от виртуальной прямой проходящей между двумя точками размера.
Самый простой вариант - использовать преднастроенный размерный стиль. Ну или уже сам объект размера редактировать.

----- добавлено через 10 сек. -----
Насчет второго не уверен.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 10.11.2017, 21:50
#3412
Fedorino

автоматизация и организация черчения
 
Регистрация: 17.11.2009
Sterlitamak
Сообщений: 125


Цитата:
Сообщение от Кулик Алексей aka kpblc.
Самый простой вариант - использовать преднастроенный размерный стиль. Ну или уже сам объект размера редактировать.
В настройках размерного стиля, есть возможность задавать длину отображения выносной линии, но никак не отступ.
В самом объекте данный параметр заблокирован для редактирования(при просмотре через vlax-dump-object, рядом со значением стоит (RO)).
Есть мысль расчитывать третью(последнюю) точку, указываемую при построении размера, но это слишком сложные геометрические вычисления.
__________________
слесарь САПР
Fedorino вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 10.11.2017, 22:53
#3413
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Fedorino Посмотреть сообщение
В настройках размерного стиля, есть возможность задавать длину отображения выносной линии, но никак не отступ.
А это что?
Миниатюры
Нажмите на изображение для увеличения
Название: 2017-11-10_22-51-58.png
Просмотров: 29
Размер:	14.2 Кб
ID:	195556  
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 11.11.2017, 06:28
#3414
Setvar

Всего понемногу
 
Регистрация: 10.02.2007
Москва
Сообщений: 555


А это вот что:
Из Справки.
Отступ от объекта
Указывает расстояние, на которое выносные линии отступают от точек объекта. (Системная переменная DIMEXO)
Автор темы напрасно применил термин "отступ".

Цитата:
Сообщение от Fedorino Посмотреть сообщение
Есть мысль расчитывать третью(последнюю) точку, указываемую при построении размера, но это слишком сложные геометрические вычисления.
В моем примере как раз вычисляется точка положения размерной линии. Так что твоя мысль опоздала.
В простом примере эти вычисления не оправданы, но, например, при создании отверстия в перекрытии с автоматическим проставлением размеров, дальнейшим преобразовании прмоугольника отверстия вместе с размерами в блок и вставкой потом этого блока с нужным поворотом в нужное место - в этом случае подобные вычисления себя оправдывают.
__________________
Установи FILEDIA в 1 и не парься.
Setvar вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 11.11.2017, 06:54
#3415
Fedorino

автоматизация и организация черчения
 
Регистрация: 17.11.2009
Sterlitamak
Сообщений: 125


Цитата:
Сообщение от Setvar Посмотреть сообщение
А это вот что:
Из Справки.
Отступ от объекта
Указывает расстояние, на которое выносные линии отступают от точек объекта. (Системная переменная DIMEXO)
Да, я не это имел ввиду.

Цитата:
Сообщение от Setvar Посмотреть сообщение
Автор темы напрасно применил термин "отступ".
Не в совершенстве владею терминологией, возможно ввел кого-то в заблуждение.

Цитата:
Сообщение от Setvar Посмотреть сообщение
В моем примере как раз вычисляется точка положения размерной линии. Так что твоя мысль опоздала.
Извини, я почему-то не сразу твой код заметил. Сейчас проанализировал, есть интересные моменты, но если объект поворачивать на определенный угол, то размеры пляшут.

Цитата:
Сообщение от Setvar Посмотреть сообщение
В простом примере эти вычисления не оправданы, но, например, при создании отверстия в перекрытии с автоматическим проставлением размеров, дальнейшим преобразовании прмоугольника отверстия вместе с размерами в блок и вставкой потом этого блока с нужным поворотом в нужное место - в этом случае подобные вычисления себя оправдывают.
У меня задача - создать лисп, позволяющий проставлять размеры с выносными линиями фиксированной длины, которую можно задавать. В том числе указывать направление построения размера, кликом мыши.

----- добавлено через ~4 ч. -----
Кстати получилось, проставлять размеры с фиксированной длиной выносных линий, способом вычисления третьей точки.
Выкладываю тестовый код, может кому пригодится, без проверок на пустой ввод и функции ошибки.
Тестил мало, возможно есть ошибки.
Код:
[Выделить все]
 (defun c:test (/ pnt1 pnt2 x5 y5 pnt3 pnt4 rs pnt5)
	(repeat 15
			(setvar "osmode" 1)
			(if (not rs) (setq rs (getreal "\nУкажите длину выносных линий: ")))
			(setq pnt1 (getpoint "\nУкажите первую точку размера: "))
			(setq pnt2 (getpoint pnt1 "\nУкажите вторую точку размера: "))
			(setvar "osmode" 0)
			(setq pnt3 (list (/ (+ (car pnt1) (car pnt2)) 2) (/ (+ (car (cdr pnt1)) (car (cdr pnt2))) 2) 0.0))
			(setvar "ORTHOMODE" 0)
			(setq pnt4 (getpoint pnt3 "\nУкажите направление построения: "))
			(cond 
				((= (rtos 0 2 4) (rtos (angle pnt1 pnt2) 2 4))
					(setq x5 (car pnt3))
					(if (< (car (cdr pnt3)) (car (cdr pnt4))) (setq y5 (+ (car (cdr pnt1)) rs)) (setq y5 (- (car (cdr pnt1)) rs)))
				)
				((or (eq (rtos 1.5708 2 4) (rtos (angle pnt1 pnt2) 2 4)) (eq (rtos 4.71239 2 4) (rtos (angle pnt1 pnt2) 2 4)))
					(if (< (car pnt3) (car pnt4)) (setq x5 (+ (car pnt1) rs)) (setq x5 (- (car pnt1) rs)))
					(setq y5 (car (cdr pnt3)))
				)
				((and (/= (rtos 1.5708 2 4) (rtos (angle pnt1 pnt2) 2 4)) (/= (rtos 0 2 4) (rtos (angle pnt1 pnt2) 2 4)))
					(if (< (car pnt3) (car pnt4)) (setq x5 (+ (car pnt3) (* rs (abs (sin (angle pnt1 pnt2)))))) (setq x5 (- (car pnt3) (* rs (abs (sin (angle pnt1 pnt2)))))))		
					(if (< (car (cdr pnt3)) (car (cdr pnt4))) (setq y5 (+ (car (cdr pnt3)) (* rs (abs (cos (angle pnt1 pnt2)))))) (setq y5 (- (car (cdr pnt3)) (* rs (abs (cos (angle pnt1 pnt2)))))))
				)
			)			
			(setq pnt5 (list x5 y5 0.0))
			(vl-cmdf "_dimaligned" pnt1 pnt2 pnt5)
	)
)
__________________
слесарь САПР
Fedorino вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 14.11.2017, 15:02
#3416
Wolkodaw


 
Регистрация: 21.04.2009
Тюмень
Сообщений: 92


Добрый вечер! Возможно ли в LISPе реализовать двойную сортировку и как это сделать (только средствами Active X)? Например, имеется набор блоков с разными именами. Программа выделяет все блоки, сортирует их сначала по наименованию, а затем, внутри каждого списка блоков с одинаковым именем, еще и по длине. То есть список получается типа (А длиной 200, А длиной 100, Б длиной 500, Б длиной 50).
Wolkodaw вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 14.11.2017, 15:28
#3417
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,192


Я бы делал наоборот: сначала выбрал уникальные этой функцией, а затем отсортировал по наименованию.
skkkk на форуме вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 14.11.2017, 16:31
#3418
Setvar

Всего понемногу
 
Регистрация: 10.02.2007
Москва
Сообщений: 555


Для Wolkodaw.
Что такое "длина" блока?
Как это могут быть блоки с одним и тем же именем, но разной "длиной"?
__________________
Установи FILEDIA в 1 и не парься.
Setvar вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 14.11.2017, 17:52
#3419
Сергей812


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


Цитата:
Сообщение от Setvar Посмотреть сообщение
Как это могут быть блоки с одним и тем же именем, но разной "длиной"?
Линейный параметр в динблоке, например
Сергей812 вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 14.11.2017, 18:28
#3420
Setvar

Всего понемногу
 
Регистрация: 10.02.2007
Москва
Сообщений: 555


Сергей812, а ты разве Wolkodaw?
__________________
Установи FILEDIA в 1 и не парься.
Setvar вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

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

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

Быстрый переход

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

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||