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

Вернуться   Форум 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.
Просмотров: 1973489
 
Непрочитано 30.09.2010, 06:28
#1061
ShaggyDoc

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Надеюсь, не имелось в виду "сделать атрибут с выравниванием по ширине"?
Ну, это "на усмотрение". По конкретным условиям. Вообще-то для таких маленьких "этикеток", которых в чертежах бывает много (отметки на планах, категории и т.п.), целесообразно сделать выравнивание по центру. Там вносится достаточно постоянная по длине информация.

Если же действительно иногда вылезает за пределы бокса, то можно и по ширине сделать, с добавлением, как и догадался Frigate, в необходимых случаях пробелов для "ляповатого" вида. Это легко делать программно. А можно и со сжатием шрифта побаловаться, а выравнивание всегда по центру делать. Чуть больше сжатый шрифт атрибута в таких этикетках нормально смотрится.

Да и растяжение на мизерной длине в 10 мм не так уж плохо смотрится, если там несколько символов.
ShaggyDoc вне форума  
 
Непрочитано 30.09.2010, 06:37
#1062
Frigate

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


Кулик Алексей aka kpblc

именно это и имелось в виду, как я понял. И сделал - все работает очень даже хорошо

А чем, по-твоему, плох атрибут с выравниванием"по ширине", Алексей?
Frigate вне форума  
 
Непрочитано 30.09.2010, 08:27
#1063
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Frigate Посмотреть сообщение
чем, по-твоему, плох атрибут с выравниванием"по ширине"
Все уже сказано:
Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
растяжение на мизерной длине в 10 мм не так уж плохо смотрится, если там несколько символов
Если устанавливать выравнивание по ширине, то (по моим ощущениями) это будет нормально смотреться, если ширина текста укладывается в условие
Границы-10% <= ШиринаТекста <= Границы+30%
В противном случае текст становится трудночитаемым.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.09.2010, 08:52
#1064
Frigate

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


Кулик Алексей aka kpblc

ну да, я понял, о чем ты.
Я в блоке левую точку привязки текста расположил прямо на рамке 10 на 5, а правую точку расположил на 9.7 мм, т.е. на 0.3 мм левее правой стороны рамки - все очень даже нормально смотрится
Frigate вне форума  
 
Непрочитано 30.09.2010, 09:00
#1065
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Если вставлять пробелы, то лучше, видимо, использовать непропорциональный шрифт.
Profan вне форума  
 
Непрочитано 30.09.2010, 09:29
#1066
Frigate

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


Profan ,

шрифт может быть только один, принятый по СТП - GOST2.304. С определенной же высотой - 3 мм.
Frigate вне форума  
 
Непрочитано 30.09.2010, 10:09
#1067
Do$

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


Offtop: Шрифт по ГОСТу, а высота - нет
Do$ вне форума  
 
Непрочитано 30.09.2010, 11:02
#1068
ShaggyDoc

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


Цитата:
Сообщение от Frigate Посмотреть сообщение
Profan ,

шрифт может быть только один, принятый по СТП - GOST2.304. С определенной же высотой - 3 мм.
Не употребляйте никто таких слов, а то придет Vova и....
ShaggyDoc вне форума  
 
Непрочитано 30.09.2010, 12:20
#1069
Frigate

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


Подниму опять вопрос про Password, ибо опять наткнулся на такое свойство. Пароль не связан с блоком, но связан со вставкой блока.
Вот из справки:


Цитата:
RetVal = object.InsertBlock(InsertionPoint, Name, Xscale, Yscale, ZScale, Rotation [, Password])

Object

ModelSpace, PaperSpace, Block
The objects this method applies to.

InsertionPoint

Variant (three-element array of doubles); input-only
The 3D WCS coordinates specifying the location in the drawing to insert the block.

Name

String; input-only
The name of the AutoCAD drawing file or the name of the block to insert. If it is a file name, include the .dwg extension and any path information necessary for AutoCAD to find the file.

Xscale

Double; input-only; optional
The default equals 1.0. Must be a positive number.

Yscale

Double; input-only; optional
The default equals 1.0. Must be a positive number.

Zscale

Double; input-only; optional
The default equals 1.0. Must be a positive number.

Rotation

Double; input-only; optional
The default equals 0.0 radians.

Password

Variant; input-only; optional


RetVal

BlockRef object
The placed block as a Block Reference object.
Кто-нибудь может знает, что это за пароль и для чего нужен?
Frigate вне форума  
 
Непрочитано 30.09.2010, 12:56
#1070
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Frigate, про Password у меня такое предположение. Вообще-то свойство Password относиться не к блоку, а к объекту "SecurityParams", использование которго позволяет задать дополнительный атрибуты для чертежа. А так как для вставки блока может использоваться другой dwg чертеж, у которого есть пароль, то его, этот пароль и нужно будет указать в RetVal = object.InsertBlock(InsertionPoint, Name, Xscale, Yscale, ZScale, Rotation [, Password]).
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 30.09.2010, 13:30
#1071
Frigate

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


Нужна помощь. Что-то не получается сделать вставку блока никак

Блок "ДГК-1" сам создан и его можно вставить в чертеж обычными средствами.

Код:
[Выделить все]
(setq mspace (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))))
(setq pt (ADV-CONVERTDATATYPE-3D_POINT-TO-2D_VARIANT (getpoint "Укажите точку вставки списка кабелей: ")))
(setq blk-name "ДГК-1")
(setq bl-name (vlax-make-variant blk-name vlax-vbString))
(vla-InsertBlock  mspace pt bl-name 1 1 1 0)
ошибку кажет

Цитата:
ошибка: Ошибка Automation. Ошибка файлера
наверное я что-то с типами данных понапутал. Помогите разобраться, плиз.
Frigate вне форума  
 
Непрочитано 30.09.2010, 13:37
#1072
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
(defun test (/ adoc model blk_name ins_pt)
  (setq blk_name "ДГК-1"
        adoc     (vla-get-activedocument (vlax-get-acad-object))
        model    (vla-get-modelspace adoc)
        ) ;_ end of setq
  (vla-startundomark adoc)
  (if (and (= (type (setq ins_pt (vl-catch-all-apply
                                   (function
                                     (lambda ()
                                       (getpoint "\nТочка вставки <Отмена> : ")
                                       ) ;_ end of lambda
                                     ) ;_ end of function
                                   ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'list
              ) ;_ end of =
           ins_pt
           ) ;_ end of and
    (vla-insertblock
      model
      blk_name
      (vlax-3d-point ins_pt)
      1.
      1.
      1.
      0.
      ) ;_ end of vla-InsertBlock
    ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
Не проверял.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.09.2010, 14:05
#1073
Frigate

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


Алексей,

твой код загрузил, ткнул точку вставки и получил


Код:
[Выделить все]
ошибка: lisp-значение не может быть приведено к 
данному типу ВАРИАНТА:  #<variant 8197 ...>
У меня мой изначальный код получился, там был глюк какой-то, видимо из-за того, что функцию преобразования точки в вариант скопировал с WORDа.

А не нужно ли, при вставке имени блока как переменной, использовать


Код:
[Выделить все]
 
(setq blk_name (vlax-make-variant "ДГК-1" vlax-vbString))

у меня вот так получилось:

Код:
[Выделить все]
 
(setq mspace (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))))
(setq pt (ADV-CONVERTDATATYPE-3D_POINT-TO-2D_VARIANT (getpoint "Укажите точку вставки списка кабелей: ")))
(setq blk-name "ДГК-1")
(setq bl-name (vlax-make-variant blk-name vlax-vbString))
(vla-InsertBlock  mspace pt bl-name 1 1 1 0)

возможно дело все в таком непонятном списке у тебя в программе, который нигде не определен?
Что там должно быть?

Последний раз редактировалось Frigate, 30.09.2010 в 14:26.
Frigate вне форума  
 
Непрочитано 30.09.2010, 14:34
#1074
Кулик Алексей aka kpblc
Moderator

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


Поменяй местами строки (vlax-3d-point inx_pt) и blk_name:
Код:
[Выделить все]
(defun test (/ adoc model blk_name ins_pt)
  (setq blk_name "ДГК-1"
        adoc     (vla-get-activedocument (vlax-get-acad-object))
        model    (vla-get-modelspace adoc)
        ) ;_ end of setq
  (vla-startundomark adoc)
  (if (and (= (type (setq ins_pt (vl-catch-all-apply
                                   (function
                                     (lambda ()
                                       (getpoint "\nТочка вставки <Отмена> : ")
                                       ) ;_ end of lambda
                                     ) ;_ end of function
                                   ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'list
              ) ;_ end of =
           ins_pt
           ) ;_ end of and
    (vla-insertblock
      model
      (vlax-3d-point ins_pt)
      blk_name
      1.
      1.
      1.
      0.
      ) ;_ end of vla-InsertBlock
    ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
А 'list - это проверка, действительно пользователь ткнул в точку или нажал Esc (пробел тоже отслеживается)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.09.2010, 15:01
#1075
ShaggyDoc

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


Кстати, проверять введена ли именно точка, всегда надо. Лучше сделать отдельную функцию наподобие

Код:
[Выделить все]
(defun ru-is-point (point)
    ;;(ru-is-point (list 10.0 0.0 10)) T  
    ;;(ru-is-point (list 0.0 0.0))  T
    ;;(ru-is-point (list 0.0))  nil
    ;;(ru-is-point nil)  nil
    (and (listp point)
         (<= 2 (length point) 3)
         (apply (function and) (mapcar (function numberp) point))
    ) ;_ end of and
) ;_ end of defun
А то "листы" оне всякие бывают. Аналогично, когда надо, можно проверять введена ли 3D-точка

Код:
[Выделить все]
(defun ru-is-3d-point (point)
    ;;(ru-is-3d-point (list 10.0 0.0 10)) T  
    ;;(ru-is-3d-point (list 0.0 0.0)) nil  
    ;;(ru-is-3d-point (list 0.0))  nil
    ;;(ru-is-3d-point nil)  nil
    (and (listp point)
         (= 3 (length point))
         (apply (function and) (mapcar (function numberp) point))
    ) ;_ end of and
)
ShaggyDoc вне форума  
 
Непрочитано 30.09.2010, 15:02
#1076
Кулик Алексей aka kpblc
Moderator

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


ShaggyDoc, я проверял через type вот почему:
Код:
[Выделить все]
_$ (listp '(0. 0. 0.))
T
_$ (listp nil)
T
_$ (listp '(nil))
T
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.09.2010, 19:11
#1077
gomer

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


Вставлю свои 5 копеек по поводу "точечности":
Код:
[Выделить все]
(defun IsPoint (pt)
  (not (vl-catch-all-error-p
	 (vl-catch-all-apply 'vlax-3d-point (list pt))
       )
  )
)
gomer вне форума  
 
Непрочитано 01.10.2010, 06:29
#1078
ShaggyDoc

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


Цитата:
Сообщение от gomer Посмотреть сообщение
Вставлю свои 5 копеек по поводу "точечности":
Код:
[Выделить все]
(defun IsPoint (pt)
  (not (vl-catch-all-error-p
	 (vl-catch-all-apply 'vlax-3d-point (list pt))
       )
  )
)
Да, можно и как-то так. Но я стараюсь в мелких функциях, по возможности, не использовать особенностей последних версий VL. Иногда приходится делать "downgrade" программ... Вот даже версию для AutoCAD 14 в рабочем состоянии держу, а один очень уважаемый мною клиент до сих пор версию 10 (не 2010, а именно 10) использует. Так уж сложилось...
ShaggyDoc вне форума  
 
Непрочитано 01.10.2010, 08:10
#1079
Кулик Алексей aka kpblc
Moderator

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


По поводу низкоуровневых функций с отловом ошибок... В некоторых случаях (особенно это касается вертикальных приложений предыдущих версий) "вложенность" vl-catch-* функций не может превышать некоторого значения (по-моему, 4). Абсолютно недокументированная особенность, в свое время немало мне подпортившая мне жизнь: код просто вылетал с сообщением о переполнении.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 01.10.2010, 11:51
#1080
ShaggyDoc

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


Цитата:
"вложенность" vl-catch-* функций не может превышать некоторого значения (по-моему, 4)
И это тоже. vl-catch-* замечательные, я бы сказал революционные, функции, снявшие массу проблем. Для VL, конечно, в других системах давно имелись try...except...finally и подобные конструкции.

Но использовать их надо с умом, где действительно необходимо. А если можно сделать простую проверку, лучше обойтись ею.

Утрированный пример - всем известно, что на 0 делить нельзя. Не умеет делать никакой процессор. Можно "перебдеть" и обертывать в ловушку все операции деления. И я даже реально видел такой код. А можно просто проверять на "нолистость" на верхнем уровне, не проуская неверные числа.

Для ловушек много и человеческих аналогов. Не обязательно каждого заставлять креститься или выпивать горилки для проверки на "правильность". Или дубиной по голове бить, или еще что... Обычно есть более простые способы.
ShaggyDoc вне форума  
Ответ
Вернуться   Форум 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