Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу) - Страница 38
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

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

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

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

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (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.
Просмотров: 2048451
 
Непрочитано 29.01.2010, 13:40
#741
VVA

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


Для справки:
_dwgru-get-spds-text-and-range нашел в #485
Red Nova,
Выложи списки, которые возвращат ниже приведенный код для 2009 и 2010 Автокада
Код:
[Выделить все]
(entget (car(entsel "\nSelect SPDS object:")) '("*"))
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 29.01.2010, 15:22
#742
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, տ.գ.թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,990
Отправить сообщение для Red Nova с помощью Skype™


VVA,
2009
Цитата:
Command: (entget (car(entsel "\nSelect SPDS object:")) '("*"))

Select SPDS object(-1 . <Entity name: 7effead0>) (0 . "spdsNotePosition")
(330 . <Entity name: 7ef04cf8>) (5 . "187A0A") (100 . "AcDbEntity") (67 . 0)
(410 . "Model") (8 . "0") (48 . 100.0) (370 . 25) (100 . "mcsDbObject") (100 .
"mcsDbObjectNotePosition") (90 . 1) (301 . "Name") (300 . "1") (301 . "Info")
(300 . "Позиционная выноска\r\n1\r\nшвеллер 20, L=1000") (301 . "Scale") (40 .
100.0) (301 . "CutAcElements") (290 . 1) (301 . "Text style") (300 . "GOST
2.304") (301 . "Первая строка") (300 . "1") (301 . "Вторая строка") (300 .
"швеллер 20, L=1000") (301 . "Выравнивание текста") (90 . 1) (301 .
"Направление полки") (40 . 0.0) (301 . "Высота текста") (40 . 2.5) (301 .
"Высота малого текста") (40 . 2.5) (301 . "Шаг угла") (40 . 0.0))
2010
Цитата:
Command: (entget (car(entsel "\nSelect SPDS object:")) '("*"))

Select SPDS object(-1 . <Entity name: 7d96c978>) (0 . "spdsNotePosition")
(330 . <Entity name: 7ed17cf8>) (5 . "1879DF") (100 . "AcDbEntity") (67 . 0)
(410 . "Model") (8 . "0") (48 . 100.0) (370 . 25) (100 . "mcsDbObject") (100 .
"mcsDbObjectNotePosition") (90 . 1) (301 . "Name") (300 . "1") (301 . "Info")
(300 . "Позиционная выноска\r\n1\r\nшвеллер 20, L=1000") (301 . "Scale") (40 .
100.0) (301 . "CutAcElements") (290 . 1) (301 . "WipeOut") (290 . 0) (301 .
"Text style") (300 . "GOST 2.304") (301 . "String1") (300 . "1") (301 .
"String2") (300 . "швеллер 20, L=1000") (301 . "TextAlign") (90 . 1) (301 .
"RackDir") (40 . 0.0) (301 . "TextSize") (40 . 2.5) (301 . "SmallTextSize") (40
. 2.5) (301 . "AngleStep") (40 . 0.0))
Рожици в цитате естественно означают соответствующие символы, но вполне соответствуют моему настроению.
Миниатюры
Нажмите на изображение для увеличения
Название: untitled.JPG
Просмотров: 129
Размер:	7.7 Кб
ID:	32641  
__________________
Блог
Red Nova вне форума  
 
Непрочитано 29.01.2010, 15:41
#743
Кулик Алексей aka kpblc
Moderator

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


"Насухую", предполагая, что СПДС 6 только в 2010:
Код:
[Выделить все]
(defun _dwgru-get-spds-text-and-range (/ selset lst cadver)
                                      ;|
*    Возвращает список строк выделенных выносок. В набор попадают узловые выноски,
* позиционные выноски, цепные и гребенчатые.
*    Параметры вызова:
	нет
*    Примеры вызова:
(_dwgru-get-spds-text)
	;
|;
  (setq cadver (atoi (vl-string-trim " VISUALP" (strcase (ver)))))
  (if
    (and
      (= (type (setq selset (vl-catch-all-apply
                              (function (lambda () (ssget)))
                              ) ;_ end of vl-catch-all-apply
                     ) ;_ end of setq
               ) ;_ end of type
         'pickset
         ) ;_ end of =
      (setq selset
             (vl-remove-if-not
               (function
                 (lambda (x)
                   (member (cdr (assoc 0 x))
                           '("spdsNotePosition"
          ;"spdsNoteKnot" закомментировал тапорно, чтобы исключить из выбора узловые выноски
                             "spdsNoteComb"
                             "spdsNoteChain"
                             )
                           ) ;_ end of member
                   ) ;_ end of lambda
                 ) ;_ end of function
               (mapcar
                 (function (lambda (a)
                             (vl-remove-if-not
                               '(lambda (b) (member (car b) '(0 300 301 90)))
                               (entget a)
                               ) ;_ end of vl-remove-if-not
                             ) ;_ end of lambda
                           ) ;_ end of function
                 (_dwgru-conv-pickset-to-list selset)
                 ) ;_ end of mapcar
               ) ;_ end of vl-remove-if-not
            ) ;_ end of setq
      ) ;_ end of and
     (setq
       lst
        (mapcar
          (function
            (lambda (item)
              (cond
                ((= (cdr (assoc 0 item)) "spdsNoteKnot")
                 (append (mapcar
                           (function cdr)
                           (vl-remove-if-not
                             (function
                               (lambda (x)
                                 (= (car x) 300)
                                 ) ;_ end of lambda
                               ) ;_ end of function
                             (reverse
                               (member '(301 . "Выравнивание текста")
                                       (reverse (member '(301 . "Номер узла") item))
                                       ) ;_ end of member
                               ) ;_ end of reverse
                             ) ;_ end of vl-remove-if-not
                           ) ;_ end of mapcar
                         (list 1)
                         ) ;_ end of append
                 )
                ((= (cdr (assoc 0 item)) "spdsNotePosition")
                 (append (mapcar
                           (function cdr)
                           (vl-remove-if-not
                             (function
                               (lambda (x)
                                 (= (car x) 300)
                                 ) ;_ end of lambda
                               ) ;_ end of function
                             (member (cons 301
                                           (if (< cadver 2010)
                                             "Первая строка"
                                             "String1"
                                             ) ;_ end of if
                                           ) ;_ end of cons
                                     item
                                     ) ;_ end of member
                             ) ;_ end of vl-remove-if-not
                           ) ;_ end of mapcar
                         (list 1)
                         ) ;_ end of append
                 )
                ((member (cdr (assoc 0 item))
                         '("spdsNoteComb" "spdsNoteChain")
                         ) ;_ end of member
                 (append
                   (mapcar
                     (function cdr)
                     (vl-remove-if-not
                       (function
                         (lambda (x)
                           (= (car x) 300)
                           ) ;_ end of lambda
                         ) ;_ end of function
                       (reverse
                         (member '(301 . "Выравнивание текста")
                                 (reverse (member '(301 . "Первая строка") item))
                                 ) ;_ end of member
                         ) ;_ end of reverse
                       ) ;_ end of vl-remove-if-not
                     ) ;_ end of mapcar
                   (list (cdr (assoc 90 (reverse item))))
                   ) ;_ end of cons
                 )
                ) ;_ end of cond
              ) ;_ end of lambda
            ) ;_ end of function
          selset
          ) ;_ end of mapcar
       ) ;_ end of setq
     ) ;_ end of if
  lst
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.01.2010, 15:44
#744
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Опоздал.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 29.01.2010, 16:20
#745
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, տ.գ.թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,990
Отправить сообщение для Red Nova с помощью Skype™


Спасибо, заработало
А возможно сделать так чтобы для обоих версий СПДС одна и та же функция была рабочей? Скажем сперва проверить версию СПДС потом в зависимости от нее то либо другое.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 29.01.2010, 16:27
#746
Кулик Алексей aka kpblc
Moderator

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


Если бы мне удалось это сделать, то все было бы наверняка проще. Значительно проще.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.01.2010, 17:17
#747
VVA

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


Кулик Алексей aka kpblc, В порядке бреда : после entget'a subst'ом и заменить (301 . "String1") на (301 . "Первая строка") и не привязываться к версии Автокада
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 29.01.2010, 22:35
#748
Кулик Алексей aka kpblc
Moderator

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


Можно и так Но лично я сейчас не в силах что-либо полезное делать
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.01.2010, 20:12
#749
superkot007


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


Раз уж есть такая тема - задам вопрос тут...
Код:
[Выделить все]
(defun C:SRP24 (/ pt pt1 pt2 pt3 m1 m2 v VarOsMode)
; Разрыв вертикальных линий, равный 4 мм
(setq pt (getpoint "\n \n \nВведите точку пересечения линий:"))

; Отключить привязку
  (setq VarOsMode (getvar "osmode"))
  (setvar "osmode" 0)

  (setq pt1 (osnap pt "_int"))
  (setq m1 (+ (cadr pt1) 2))
  (setq pt2 (list (car pt1) m1))
  (setq m2 (- (cadr pt1) 2))
  (setq pt3 (list (car pt1) m2))
  (command "_break" pt2 pt3)

; Включить привязку
  (setvar "osmode" VarOsMode)
)
1. как задать произвольный размер разрыва
2. горизонт/вертик разрыв (направление разрыва указывается мышкой)

Последний раз редактировалось superkot007, 30.01.2010 в 21:53.
superkot007 вне форума  
 
Непрочитано 31.01.2010, 07:41
#750
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Сообщение от superkot007 Посмотреть сообщение
Раз уж есть такая тема - задам вопрос тут...
Код:
[Выделить все]
(defun C:SRP24 (/ pt pt1 pt2 pt3 m1 m2 v VarOsMode)
; Разрыв вертикальных линий, равный 4 мм
(setq pt (getpoint "\n \n \nВведите точку пересечения линий:"))

; Отключить привязку
  (setq VarOsMode (getvar "osmode"))
  (setvar "osmode" 0)

  (setq pt1 (osnap pt "_int"))
  (setq m1 (+ (cadr pt1) 2))
  (setq pt2 (list (car pt1) m1))
  (setq m2 (- (cadr pt1) 2))
  (setq pt3 (list (car pt1) m2))
  (command "_break" pt2 pt3)

; Включить привязку
  (setvar "osmode" VarOsMode)
)
1. как задать произвольный размер разрыва
2. горизонт/вертик разрыв (направление разрыва указывается мышкой)
Задать размер разрыва самое простое - сделать его величину в виде опции с каким-то значением по умолчанию. Хотя вообще-то лучше, чтобы длина разрыва определялась автоматически в зависимости от ширины и веса линейных объектов.

Но программа принципиально неверно делается.

1. Надо делать разрыв не только "линий" (программисты говорят и пишут "LINE", в крайнем случае "отрезок"), а и других типов примитивов, похожих на "линии". У них точки совсем иначе извлекаются.

2. Разрывать надо одну "линию", та, которая должна лежать ниже. Для этого надо указать не точку пересечения, а примитивы - тот, который надо разорвать и тот, которым надо разорвать. Указывать надо в любом месте, пересечений может оказаться несколько. При этом ещё учитывать, что примитивы (полилинии) могут иметь физическую ширину.

В результате реальная программа вырастет в размере примерно да двухсот строк, и это если использовать библиотеки.

Такую программу я включал в исходники к книге "САПР на базе AutoCAD - как это делается" - ru_cross_lines.lsp.
ShaggyDoc вне форума  
 
Непрочитано 31.01.2010, 12:29
#751
superkot007


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


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Задать размер разрыва самое простое - сделать его величину в виде опции с каким-то значением по умолчанию. Хотя вообще-то лучше, чтобы длина разрыва определялась автоматически в зависимости от ширины и веса линейных объектов.
Будем разбираться...
Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Но программа принципиально неверно делается.
1. Надо делать разрыв не только "линий" (программисты говорят и пишут "LINE", в крайнем случае "отрезок"), а и других типов примитивов, похожих на "линии". У них точки совсем иначе извлекаются. 2. Разрывать надо одну "линию", та, которая должна лежать ниже. Для этого надо указать не точку пересечения, а примитивы - тот, который надо разорвать и тот, которым надо разорвать. Указывать надо в любом месте, пересечений может оказаться несколько. При этом ещё учитывать, что примитивы (полилинии) могут иметь физическую ширину. В результате реальная программа вырастет в размере примерно да двухсот строк, и это если использовать библиотеки.

Мне просто надо пересекающиеся ОТРЕЗКИ разрывать, а тут уже предлагаете целый комбайн использовать...

Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Такую программу я включал в исходники к книге "САПР на базе AutoCAD - как это делается" - ru_cross_lines.lsp.
За книгу спасибо (уже нашел и качаю), будем учиться...
superkot007 вне форума  
 
Автор темы   Непрочитано 19.02.2010, 16:35
#752
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, տ.գ.թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,990
Отправить сообщение для Red Nova с помощью Skype™


Оказывается заработала теперь только с spdsnoteposition, а остальные выноски в пролете...
"spdsNoteKnot"
"spdsNoteComb"
"spdsNoteChain"
Пожогите пожалуйста и для них исправить функцию _dwgru-get-spds-text-and-range.
Вот что выдает тестирование этих объектов СПДС функцией от VVA поочередно в 2010
Код:
[Выделить все]
Command: (entget (car(entsel "\nSelect SPDS object:")) '("*"))

Select SPDS object:((-1 . <Entity name: 7edb02e0>) (0 . "spdsNoteKnot") (330 . 
<Entity name: 7ed17cf8>) (5 . "16BC54") (100 . "AcDbEntity") (67 . 0) (410 . 
"Model") (8 . "0") (48 . 15.0) (370 . 20) (100 . "mcsDbObject") (100 . 
"mcsDbObjectNoteKnot") (90 . 1) (301 . "Name") (300 . "1") (301 . "Info") (300 
. "Узловая выноска\r\n1\r\nШвеллер 20, L=1000") (301 . "Scale") (40 . 15.0) 
(301 . "CutAcElements") (290 . 1) (301 . "WipeOut") (290 . 0) (301 . "Text 
style") (300 . "CS Arm Unicode") (301 . "XRadius") (40 . 540.145) (301 . 
"YRadius") (40 . 441.036) (301 . "NodeNumber") (300 . "1") (301 . 
"SheetNumber") (300 . "") (301 . "NodeAddress") (300 . "Швеллер 20, L=1000") 
(301 . "TextAlign") (300 . "По центру") (301 . "RackDir") (40 . 0.0) (301 . 
"TextSize") (40 . 3.5) (301 . "SmallTextSize") (40 . 2.5) (301 . "AngleStep") 
(40 . 15.0) (301 . "Circle") (290 . 0))

Command:
.ERASE
Select objects: 1 found

Select objects:

Command: _u
Command: (entget (car(entsel "\nSelect SPDS object:")) '("*"))

Select SPDS object:((-1 . <Entity name: 7edb0300>) (0 . "spdsNoteComb") (330 . 
<Entity name: 7ed17cf8>) (5 . "16BC58") (100 . "AcDbEntity") (67 . 0) (410 . 
"Model") (8 . "0") (48 . 15.0) (370 . 20) (100 . "mcsDbObject") (100 . 
"mcsDbObjectNoteComb") (90 . 1) (301 . "Name") (300 . "1") (301 . "Info") (300 
. "Гребенчатая выноска\r\n1\r\nШвеллер 20, L=1000") (301 . "Scale") (40 . 15.0) 
(301 . "CutAcElements") (290 . 1) (301 . "WipeOut") (290 . 0) (301 . "Text 
style") (300 . "CS Arm Unicode") (301 . "String1") (300 . "1") (301 . 
"String2") (300 . "Швеллер 20, L=1000") (301 . "TextAlign") (300 . "По центру") 
(301 . "RackDir") (40 . 0.0) (301 . "TextSize") (40 . 2.5) (301 . "AngleStep") 
(40 . 0.0) (301 . "LeadersCount") (90 . 2))

Command: _spREdit
Command: (entget (car(entsel "\nSelect SPDS object:")) '("*"))

Select SPDS object:((-1 . <Entity name: 7edb0308>) (0 . "spdsNoteChain") (330 . 
<Entity name: 7ed17cf8>) (5 . "16BC59") (100 . "AcDbEntity") (67 . 0) (410 . 
"Model") (8 . "0") (48 . 15.0) (370 . 20) (100 . "mcsDbObject") (100 . 
"mcsDbObjectNoteChain") (90 . 1) (301 . "Name") (300 . "1") (301 . "Info") (300 
. "Цепная выноска\r\n1\r\nШвеллер 20, L=1000") (301 . "Scale") (40 . 15.0) (301 
. "CutAcElements") (290 . 1) (301 . "WipeOut") (290 . 0) (301 . "Text style") 
(300 . "CS Arm Unicode") (301 . "String1") (300 . "1") (301 . "String2") (300 . 
"Швеллер 20, L=1000") (301 . "TextAlign") (300 . "По центру") (301 . "RackDir") 
(40 . -1.29422e-007) (301 . "TextSize") (40 . 2.5) (301 . "LeadersCount") (90 . 
4))
А сот что в 2009-м
Код:
[Выделить все]
Command: (entget (car(entsel "\nSelect SPDS object:")) '("*"))

Select SPDS object:((-1 . <Entity name: 7ef03538>) (0 . "spdsNoteKnot") (330 . 
<Entity name: 7ef01cf8>) (5 . "207") (100 . "AcDbEntity") (67 . 0) (410 . 
"Model") (8 . "0") (48 . 100.0) (370 . 25) (100 . "mcsDbObject") (100 . 
"mcsDbObjectNoteKnot") (90 . 1) (301 . "Name") (300 . "1") (301 . "Info") (300 
. "Узловая выноска\r\n1\r\nШвеллер 20, L=1000") (301 . "Scale") (40 . 100.0) 
(301 . "CutAcElements") (290 . 1) (301 . "Text style") (300 . "GOST 2.304") 
(301 . "Горизонтальный радиус") (40 . 3703.93) (301 . "Вертикальный радиус") 
(40 . 3537.43) (301 . "Номер узла") (300 . "1") (301 . "Номер листа") (300 . 
"") (301 . "Адрес узла") (300 . "Швеллер 20, L=1000") (301 . "Выравнивание 
текста") (300 . "По центру") (301 . "Направление полки") (40 . 0.0) (301 . 
"Высота текста") (40 . 3.5) (301 . "Высота малого текста") (40 . 2.5) (301 . 
"Шаг угла") (40 . 15.0) (301 . "Окружность") (290 . 0))

Command: (entget (car(entsel "\nSelect SPDS object:")) '("*"))

Select SPDS object:((-1 . <Entity name: 7ef03568>) (0 . "spdsNoteComb") (330 . 
<Entity name: 7ef01cf8>) (5 . "20D") (100 . "AcDbEntity") (67 . 0) (410 . 
"Model") (8 . "0") (48 . 100.0) (370 . 25) (100 . "mcsDbObject") (100 . 
"mcsDbObjectNoteComb") (90 . 1) (301 . "Name") (300 . "1") (301 . "Info") (300 
. "Гребенчатая выноска\r\n1\r\nШвеллер 20, L=1000") (301 . "Scale") (40 . 
100.0) (301 . "CutAcElements") (290 . 1) (301 . "Text style") (300 . "GOST 
2.304") (301 . "Первая строка") (300 . "1") (301 . "Вторая строка") (300 . 
"Швеллер 20, L=1000") (301 . "Выравнивание текста") (300 . "По центру") (301 . 
"Направление полки") (40 . 0.0) (301 . "Высота текста") (40 . 2.5) (301 . "Шаг 
угла") (40 . 0.0) (301 . "Количество линий-выносок") (90 . 2))

Command: (entget (car(entsel "\nSelect SPDS object:")) '("*"))

Select SPDS object:((-1 . <Entity name: 7ef03570>) (0 . "spdsNoteChain") (330 . 
<Entity name: 7ef01cf8>) (5 . "20E") (100 . "AcDbEntity") (67 . 0) (410 . 
"Model") (8 . "0") (48 . 100.0) (370 . 25) (100 . "mcsDbObject") (100 . 
"mcsDbObjectNoteChain") (90 . 1) (301 . "Name") (300 . "1") (301 . "Info") (300 
. "Цепная выноска\r\n1\r\nШвеллер 20, L=1000") (301 . "Scale") (40 . 100.0) 
(301 . "CutAcElements") (290 . 1) (301 . "Text style") (300 . "GOST 2.304") 
(301 . "Первая строка") (300 . "1") (301 . "Вторая строка") (300 . "Швеллер 20, 
L=1000") (301 . "Выравнивание текста") (300 . "По центру") (301 . "Направление 
полки") (40 . 5.63933e-011) (301 . "Высота текста") (40 . 2.5) (301 . 
"Количество линий-выносок") (90 . 2))
__________________
Блог
Red Nova вне форума  
 
Автор темы   Непрочитано 22.02.2010, 19:46
#753
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, տ.գ.թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,990
Отправить сообщение для Red Nova с помощью Skype™


Не у кого пока нет идей...
__________________
Блог
Red Nova вне форума  
 
Непрочитано 23.02.2010, 13:05
#754
VVA

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


Без привязки к версии Автокада. Данные меняются по словарю. Для замены списка добавлена функция _dwgru-prepare-spds-list.
Код:
[Выделить все]
(defun _dwgru-prepare-spds-list ( lst / dict )
  (setq	dict
	 '(("ПЕРВАЯ СТРОКА" "String1")
	   ("ВТОРАЯ СТРОКА" "String2")
	   ("ВЫРАВНИВАНИЕ ТЕКСТА" "TextAlign")
           ("НОМЕР УЗЛА" "NodeNumber")
	  )
  )
  (mapcar '(lambda( x / tmp)
             (if (and
                   (= (car x) 301)
                   (setq tmp (cadr(assoc (strcase (cdr x)) dict)))
                   )
               (cons 301 tmp)
               x
             )
             )
          lst
          )
)
  
           
(defun _dwgru-get-spds-text-and-range (/ selset lst)
                                      ;|
*    Возвращает список строк выделенных выносок. В набор попадают узловые выноски,
* позиционные выноски, цепные и гребенчатые.
*    Параметры вызова:
	нет
*    Примеры вызова:
(_dwgru-get-spds-text)
	;
|;
  (if
    (and
      (= (type (setq selset (vl-catch-all-apply
                              (function (lambda () (ssget)))
                              ) ;_ end of vl-catch-all-apply
                     ) ;_ end of setq
               ) ;_ end of type
         'pickset
         ) ;_ end of =
      (setq selset
             (vl-remove-if-not
               (function
                 (lambda (x)
                   (member (cdr (assoc 0 x))
                           '("spdsNotePosition"
                             ;"spdsNoteKnot" закомментировал тапорно, чтобы исключить из выбора узловые выноски
                             "spdsNoteComb"
                             "spdsNoteChain"
                             )
                           ) ;_ end of member
                   ) ;_ end of lambda
                 ) ;_ end of function
               (mapcar
                 (function (lambda (a)
                             (_dwgru-prepare-spds-list
                             (vl-remove-if-not
                               '(lambda (b) (member (car b) '(0 300 301 90)))
                               (entget a)
                               ) ;_ end of vl-remove-if-not
                              )
                             ) ;_ end of lambda
                           ) ;_ end of function
                 (_dwgru-conv-pickset-to-list selset)
                 ) ;_ end of mapcar
               ) ;_ end of vl-remove-if-not
            ) ;_ end of setq
      ) ;_ end of and
     (setq
       lst
        (mapcar
          (function
            (lambda (item)
              (cond
                ((= (cdr (assoc 0 item)) "spdsNoteKnot")
                 (append (mapcar
                           (function cdr)
                           (vl-remove-if-not
                             (function
                               (lambda (x)
                                 (= (car x) 300)
                                 ) ;_ end of lambda
                               ) ;_ end of function
                             (reverse
                               (member '(301 . "TextAlign") ;ВЫРАВНИВАНИЕ ТЕКСТА
                                       (reverse (member
                                                  '(301 . "NodeNumber")  ; Номер узла
                                                  item))
                                       ) ;_ end of member
                               ) ;_ end of reverse
                             ) ;_ end of vl-remove-if-not
                           ) ;_ end of mapcar
                         (list 1)
                         ) ;_ end of append
                 )
                ((= (cdr (assoc 0 item)) "spdsNotePosition")
                 (append (mapcar
                           (function cdr)
                           (vl-remove-if-not
                             (function
                               (lambda (x)
                                 (= (car x) 300)
                                 ) ;_ end of lambda
                               ) ;_ end of function
                             (member '(301 . "String1");Первая строка
                                     item)
                             ) ;_ end of vl-remove-if-not
                           ) ;_ end of mapcar
                         (list 1)
                         ) ;_ end of append
                 )
                ((member (cdr (assoc 0 item))
                         '("spdsNoteComb" "spdsNoteChain")
                         ) ;_ end of member
                 (append
                   (mapcar
                     (function cdr)
                     (vl-remove-if-not
                       (function
                         (lambda (x)
                           (= (car x) 300)
                           ) ;_ end of lambda
                         ) ;_ end of function
                       (reverse
                         (member '(301 . "TextAlign") ; Выравнивание текста
                                 (reverse (member '(301 . "String1") ;Первая строка
                                                  item))
                                 ) ;_ end of member
                         ) ;_ end of reverse
                       ) ;_ end of vl-remove-if-not
                     ) ;_ end of mapcar
                   (list (cdr (assoc 90 (reverse item))))
                   ) ;_ end of cons
                 )
                ) ;_ end of cond
              ) ;_ end of lambda
            ) ;_ end of function
          selset
          ) ;_ end of mapcar
       ) ;_ end of setq
     ) ;_ end of if
  lst
  ) ;_ end of defun
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 25.02.2010, 10:21
#755
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Привет всем!

Подскажите, пожалуйста, что неправильно в моей конструкции:

(vl-cmdf "_fillet" "_r" f_r f_1 f_2)
здесь f_r - радиус скругления
f_1 и f_2 точки на пересекающихся перпендикулярно сторонах прямоугольника.

Мне выдает в окне по F2 в Акаде вот что:
Befehl: _fillet
Aktuelle Einstellungen: Modus = STUTZEN, Radius = 30.0
Erstes Objekt wählen oder [rÜckgängig/Polylinie/Radius/Stutzen/Mehrere]: _r
Rundungsradius angeben <30.0>: 30.00000000000000
Befehl:
Befehl:
Далее - ничего не происходит.
Что то нужно после задания радиуса вставить, только что и как? При вводе в командной строке все проходит, но там я "мышой" выбираю стороны скругления.


Здесь Befehl - это команда, Aktuelle Einstellungen - актуальные настройки,
Rundungsradius angeben - ввод радиуса скругления, Erstes Objekt wählen oder - выбрать первый объект или..., далее перечисления возможных вариантов.

И еще вопросик. Посредством VLA-тыры-пыры есть команда на скругление? Не могу найти пока никак.
alex8888 вне форума  
 
Непрочитано 25.02.2010, 10:37
#756
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


В команду fillet нужно передавать не точки, а примитивы. Точно не скажу, в каком виде, но либо в таком, как их возвращает функция entsel, либо просто ename - (car (entsel)).
Цитата:
И еще вопросик. Посредством VLA-тыры-пыры есть команда на скругление? Не могу найти пока никак.
Насколько я знаю - нет.
Do$ вне форума  
 
Непрочитано 25.02.2010, 11:05
#757
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Цитата:
В команду fillet нужно передавать не точки, а примитивы
Хорошо, тогда каким образом передать команде Fillet две стороны прямоугольника, образованной полилинией? Сам прямоугольник я могу сохранить в виде примитива, а что дальше?
alex8888 вне форума  
 
Непрочитано 25.02.2010, 11:56
#758
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Сообщение от alex8888 Посмотреть сообщение
Хорошо, тогда каким образом передать команде Fillet две стороны прямоугольника, образованной полилинией? Сам прямоугольник я могу сохранить в виде примитива, а что дальше?
Для полилинии нельзя и ненужно передавать две стороны. Команда запрашивает только один примитив при использовании полилинии.

Неужели трудно промоделировать все варианты запросов и ответов в командной строке?
ShaggyDoc вне форума  
 
Непрочитано 25.02.2010, 11:58
#759
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Сорри, не в те дебри полез
(vl-cmdf "_fillet" "_r" f_r f_1 f_2)
после f_r не хватает "":
(vl-cmdf "_fillet" "_r" f_r "" f_1 f_2)
Так должно работать.
Do$ вне форума  
 
Непрочитано 25.02.2010, 12:41
#760
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Цитата:
ShaggyDoc
Цитата:
Для полилинии нельзя и ненужно передавать две стороны.
Мне не нужно скруглять все углы, а только выборочные. Поэтому мне необходимо указать какие стороны надо выбрать. Как это сделать? Я выбрал точки посередине сторон и передаю их в функцию в качестве указания объектов.

Цитата:
Do$
не получилось.

Во вложении весь текст программки, может быть копаться в другую сторону?
Вложения
Тип файла: zip Fuss.zip (12.5 Кб, 124 просмотров)
alex8888 вне форума  
Ответ
Вернуться   Форум 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