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

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

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


Цитата:
Сообщение от aaalenaaa Посмотреть сообщение
как запустить вот этот лисп:
В самом начале приведен пример. Если убрать комментарии, получится:
Код:
[Выделить все]
 (ax:FindBlockTagValue (vla-get-activedocument (vlax-get-acad-object)) "blockname" "tagname" "tagvalue")
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.02.2016, 16:17
#2902
aaalenaaa


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


Огромное-огромное спасибо!!!
Какой же замечательный форум на этом сайте!!! Да и сам сайт!!! Я так много нового узнала здесь!!!
Спасибо всем!!!!
aaalenaaa вне форума  
 
Непрочитано 28.02.2016, 19:18
#2903
Neo


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


подскажите пожалуйста, как лучше нарисовать полилинию по координатам из списка двух Variant. смысл вот в чем: хочу соединить атрибуты блока полилинией. атрибуты обхожу mapcar и по условию вывожу InsertionPoint. список чищу от nill и получаю точки для полилинии. как "красивее" нарисовать линию, чтобы поменьше кода
Neo вне форума  
 
Непрочитано 28.02.2016, 20:55
#2904
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Здесь есть из чего выбрать
нарисовать полилинию из списка с координатами точек (lisp)
Команда _pline и список точек переменной длины
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 29.02.2016, 11:25
#2905
Neo


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


VVA спасибо. я для себя хотел понять как оптимальнее получить из списка Variant-ов один Variant, для построения по нему LWPolyline
Neo вне форума  
 
Непрочитано 10.03.2016, 10:46 Возврат во вложенное окно
#2906
trushev


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


Здравствуйте! Голова совсем отупела.
Не получается ни решить вопрос ни найти решение для вложенных диалоговых окон.

Как автоматически вернуться во вложенное диалоговое окно после временного закрытия окон?

Есть a.dcl и управляющий им a.lsp. Открытие вложенного окна выполняется выбором строки в поле list-box основного окна.
Далее во вложенном окне необходимо выполнить выбор с рисунка, для чего закрываются оба окна. После выбора возврат
происходит только к первому окну. Автоматический возврат к вложенному окну не получается. Что не так?

a.dcl
Код:
[Выделить все]
d_vvo : dialog {label = "ГЛАВНОЕ ОКНО";
             alignment = centered;
       spacer_1;
       : list_box {label = "ВЫБОР ВЛОЖЕННОГО ОКНА";
                    list = "0\n1\n2";
                     key = "vvo";
                  height = 4;
                   width = 40;
       }
       spacer_1;
       : row {fixed_width = true; alignment = centered;
          : button {fixed_width = true;
                          width = 8;
                      alignment = centered;
                          label = "OK";
                            key = "ok";
                   }
          : button {fixed_width = true;
                      is_cancel = true;
                          width = 8;
                      alignment = centered;
                          label = "Выход";
                            key = "canc";
                    }
          : button {fixed_width = true; width = 8; alignment = centered; label = "Инструкция"; key = "hlp";}
       }
}
vvo0 : dialog {label = "ОКНО 0";
             alignment = centered;
       spacer_1;
       : row {fixed_width = true; alignment = centered;
          : button {fixed_width = true;
                          width = 8;
                      alignment = centered;
                          label = "OK";
                            key = "ok";
                   }
          : button {fixed_width = true;
                      is_cancel = true;
                          width = 8;
                      alignment = centered;
                          label = "Выход";
                            key = "canc";
                    }
          : button {fixed_width = true;
                          width = 8;
                      alignment = centered;
                          label = "Временное закрытие";
                            key = "vzak";
          }
       }
}
vvo1 : dialog {label = "ОКНО 1";
             alignment = centered;
       spacer_1;
       : row {fixed_width = true; alignment = centered;
          : button {fixed_width = true;
                          width = 8;
                      alignment = centered;
                          label = "OK";
                            key = "ok";
                   }
          : button {fixed_width = true;
                      is_cancel = true;
                          width = 8;
                      alignment = centered;
                          label = "Выход";
                            key = "canc";
                    }
          : button {fixed_width = true;
                          width = 8;
                      alignment = centered;
                          label = "Временное закрытие";
                            key = "vzak";
          }
       }
}
vvo2 : dialog {label = "ОКНО 2";
             alignment = centered;
       spacer_1;
       : row {fixed_width = true; alignment = centered;
          : button {fixed_width = true;
                          width = 8;
                      alignment = centered;
                          label = "OK";
                            key = "ok";
                   }
          : button {fixed_width = true;
                      is_cancel = true;
                          width = 8;
                      alignment = centered;
                          label = "Выход";
                            key = "canc";
                    }
          : button {fixed_width = true;
                          width = 8;
                      alignment = centered;
                          label = "Временное закрытие";
                            key = "vzak";
          }
       }
}
a.lsp
Код:
[Выделить все]
(defun aaa (/
            f_vvo
            ;
            dlg
            f
           )
            ;
           (defun f_vvo (val
                         dlg
                         /
                         f
                        )
                        (cond ((= val "0")
                               (if (new_dialog "vvo0" dlg)
                                   (progn
                                   (action_tile "vzak" "(done_dialog 3)")
                                   (setq f (start_dialog))
                                   );progn
                                  ;ИНАЧЕ сбой работы программы 
                                   (alert (strcat "Сбой функции открытия диалогового окна"
                                                  "\n"
                                                  "\n  \"ОКНО 0\""
                                          )
                                   )
                               );if (new_dialog "vvo0" dlg)
                              )
                              ((= val "1")
                               (if (new_dialog "vvo1" dlg)
                                   (progn
                                   (action_tile "vzak" "(done_dialog 3)")
                                   (setq f (start_dialog))
                                   );progn
                                  ;ИНАЧЕ сбой работы программы 
                                   (alert (strcat "Сбой функции открытия диалогового окна"
                                                  "\n"
                                                  "\n  \"ОКНО 1\""
                                          )
                                   )
                               );if (new_dialog "vvo1" dlg)
                              )
                              ((= val "2")
                               (if (new_dialog "vvo2" dlg)
                                   (progn
                                   (action_tile "vzak" "(done_dialog 3)")
                                   (setq f (start_dialog))
                                   );progn
                                  ;ИНАЧЕ сбой работы программы 
                                   (alert (strcat "Сбой функции открытия диалогового окна"
                                                  "\n"
                                                  "\n  \"ОКНО 2\""
                                          )
                                   )
                               );if (new_dialog "vvo2" dlg)
                              )
                        );cond
                        f
           );defun f_vvo
            ;;;;
            ;;;;
            ;;;;
           (setq f 3
               dlg (load_dialog "a.dcl")
           )
            ;
           (while (= f 3)
                  (if (new_dialog "d_vvo" dlg)
                      (progn
                      (action_tile "vvo" "(if (= (f_vvo $value dlg) 3) (done_dialog 3))")
                      (setq f (start_dialog))
                      );progn
                     ;ИНАЧЕ сбой работы программы 
                      (alert (strcat "Сбой функции открытия диалогового окна"
                                     "\n"
                                     "\n  \"ГЛАВНОЕ ОКНО\""
                             )
                      )
                  );if (not (new_dialog "papka" dlg)
                  (if (= f 3)
                      (alert "ВСЕ ОКНА ЗАКРЫТЫ")
                  );if (= f 3)
           );while (= f 3)
            ;
           (unload_dialog dlg)
);defun aaa
(aaa)
trushev вне форума  
 
Непрочитано 10.03.2016, 19:43
#2907
kurstep


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


Всем привет. Очень нужна одна функция, а как ее сотворить не имею представления... Есть два чертежа - один основной с чертежами и размерами, во втором задан нужный по шаблону размерный стиль.
Нужно сделать программу которая заменяла все размеры чертежа на размеры с нужным стилем (который во втором чертеже) -
Причем желательно сделать с таким условием :
если первоначальный размер имеет высоту текста 2.5 - задавать ему шаблонный аннотативный стиль 1:1
250 - 1:100
500 - 1:200 и т.д.
Заранее спасибо)
kurstep вне форума  
 
Непрочитано 10.03.2016, 21:14
#2908
skkkk


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


Цитата:
Сообщение от kurstep Посмотреть сообщение
Очень нужна одна функция, а как ее сотворить не имею представления...
А что тут иметь? Я бы раскопал тему "Программное создание размерного стиля", подставил бы туда нужные значения (разобравшись, какие из них - нужные), и создав столько размерных стилей, сколько надо, а потом запустил бы что-либо типа такого:
Код:
[Выделить все]
 (vl-load-com)
(defun C:TEST ( / ss vla_dim text_height)
	(setq ss (ssget '((0 . "DIMENSION")))) ;;; получаем набор размеров
	(if ss ;;; если набор создан, то
		(repeat (setq i (sslength ss)) ;;; прогоняем процедуру с каждым из объектов набора по очереди
			(setq vla_dim (vlax-ename->vla-object (ssname ss (setq i (1- i)))) ;;; получаем vla-указатель на объект размера
				  text_height (vla-get-TextHeight vla_dim) ;;; получаем высоту текста
			) ;_end of setq
			(cond ;;; назначаем размерный стиль в зависимости от высоты текста
			  (	(= text_height 2.5)(vla-put-StyleName vla_dim "1:1")) ;;; в кавычках надо вписать имя нужного 
			  (	(= text_height 250)(vla-put-StyleName vla_dim "1:100")) ;;; текстового стиля, который уже должен 
			  (	(= text_height 500)(vla-put-StyleName vla_dim "1:200")) ;;; присутствовать в чертеже
			) ;_end of cond
		) ;_end of repeat
	) ;_end of if
);_end of defun
И дело с концом.

Последний раз редактировалось skkkk, 10.03.2016 в 21:21.
skkkk вне форума  
 
Непрочитано 11.03.2016, 02:37
#2909
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


если стиль размера переопределен, то это может ничего не дать
gomer вне форума  
 
Непрочитано 11.03.2016, 05:23
#2910
skkkk


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


gomer, если я правильно понял суть замечания, то это опять же к вопросу программного создания размерного стиля. Если при попытке создания он уже есть и (возможно) переопределен, то привести все его настройки в соответствие со "стандартными". А вот если речь о переопределении вручную объектов-размеров, то это действительно может ничего не дать. Не скажу особо точно о программной правке размеров - банально не сталкивался - всегда создавал программно размерные стили, по одному на каждую из нужд и сразу наносил размеры "правильно", чтоб потом не править.
И вообще, если нужна надежная рабочая и безотказная "одна функция", то на много еще таких "Как?" и "А что если..?" придется ответить.

А в конце окажется, что лучше всего было бы использовать аннотативность...
skkkk вне форума  
 
Непрочитано 11.03.2016, 09:40
#2911
kurstep


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


Спасибо большое за ответы, но мне надо не совсем это, стиль размера у меня будет один, - нужно просто чтобы у каждого размера был свой аннотативный масштаб, если размер текста 2.5 1:1, 250- 1:100....
Вопрос в том через какую функцию добавляется аннотативное свойство и добавляются аннатотивные масштабы к объекту
kurstep вне форума  
 
Непрочитано 11.03.2016, 09:46
#2912
Кулик Алексей 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 вне форума  
 
Непрочитано 28.03.2016, 23:44
#2913
Frigate

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


Приветствую коллег!

Прошу подсказать, как программно вытащить, а также записать путь, который по умолчанию предлагается для печати чертежа в pdf?
Команда печати стандартная:

Код:
[Выделить все]
 (command "_.plot"    "_Yes"	 "model"
					;Имя листа или [?] <Модель>: 
		 printer		;напр., "HP LaserJet 5200 PCL 6 uchastok"
					;Имя устройства вывода 
		 format			;Формат листа бумаги, напр.: "A4"
		 "Millimeters"		;Единицы измерения размеров листа
		 orientation		;Ориентация чертежа
		 "_No"			;Перевернуть чертеж?
		 "_Window"		;Печатаемая область
		 xy1			;Первая точка окна 
		 xy2			;Вторая точка окна 
		 "_fit"			;[Вписать]
		 "_center"		;Смещение от начала (x,y) pdили [Центрировать]
		 "_yes"			;Учитывать стили печати?
		 style			;"acad.ctb" - имя таблицы стилей печати - "monochrome.ctb"	
		 "_yes"			;Учитывать веса линий?
		"As displayed"		;Режим вывода раскрашенных ВЭ		 

		 ;для большинства принтеров:
;;;		 "_No"			;Запись чертежа в файл
;;;		 "_n"			;Сохранить изменения параметров листа
;;;		 "_yes"			;Перейти к печати

		 ;для dwg-to-pdf:
		 pause		 	;тут вбиваем на клаве название файлу pdf: "01", "02" и т.д.
		 "_n"			;Сохранить изменения параметров листа
		 "_yes"			;Перейти к печати

		 
		 
		) ;_ end of command
Frigate вне форума  
 
Непрочитано 29.03.2016, 01:09
#2914
Сергей812


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


Цитата:
Сообщение от Frigate Посмотреть сообщение
Прошу подсказать, как программно вытащить, а также записать путь, который по умолчанию предлагается для печати чертежа в pdf?
Возможно, в этой ветке.
Сергей812 вне форума  
 
Непрочитано 07.04.2016, 12:10
#2915
mkung


 
Регистрация: 05.09.2007
RUSSIA
Сообщений: 165


Удалено

Последний раз редактировалось mkung, 08.04.2016 в 07:11. Причина: Перенесено в отдельную тему
mkung вне форума  
 
Непрочитано 11.04.2016, 16:08
#2916
Сет


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


Подскажите, как программно достать точку вставки блока?
Сет вне форума  
 
Непрочитано 11.04.2016, 16:34
1 | #2917
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,992


Цитата:
Сообщение от Сет Посмотреть сообщение
Подскажите, как программно достать точку вставки блока?
(cdr (assoc 10 (entget (ssname (ssget "_:S" '((0 . "INSERT"))) 0))))
(cdr (assoc 10 (entget (car (entsel "\nУкажите блок: ")))))
Nike вне форума  
 
Непрочитано 11.04.2016, 17:12
#2918
Сет


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


Цитата:
Сообщение от Nike Посмотреть сообщение
(cdr (assoc 10 (entget (ssname (ssget "_:S" '((0 . "INSERT"))) 0))))
(cdr (assoc 10 (entget (car (entsel "\nУкажите блок: ")))))
А если средствами ActiveX?
Сет вне форума  
 
Непрочитано 11.04.2016, 17:41
1 | #2919
Кулик Алексей aka kpblc
Moderator

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


vla-get-insertionpoint
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.04.2016, 18:02
#2920
Сет


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


Никак не пойму - можно ли сортировать vla-объекты в наборе по определенному условию? Создаю набор таким образом:
Код:
[Выделить все]
 
(setq acadObj (vlax-get-acad-object))
(setq doc (vla-get-ActiveDocument acadObj))

(setq ssetObj (vla-Add (vla-get-SelectionSets doc) "TEST_SSET"))
    
(vla-SelectOnScreen ssetObj)
Нужно отсортировать элементы по координате "y". Допустим с помощью метода vla-get-InsertionPoint получу доступ к точке вставки (я не проверял работоспособность этого метода, но в справке у объекта block почему-то нет свойства InsertionPoint). Но ведь к этому набору не применить метод типа vl-sort?.. Эта функция работает со списками. Или придется преобразовывать набор объектов в список и как-то так сортировать?..
Сет вне форума  
Ответ
Вернуться   Форум 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