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

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

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

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

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (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.
Просмотров: 1568362
 
Непрочитано 14.06.2019, 13:37
#3741
Кулик Алексей aka kpblc
Moderator

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


Насколько мне известно, в лиспе подобного нет, не было и вряд ли предвидится.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.06.2019, 13:47
#3742
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,069


Цитата:
Сообщение от T.Bagdat Посмотреть сообщение
Подскажите, можно ли с помощью лиспа подсветить не всю полилинию, а отдельный сегмент, на манер стандартной команды Сопряжение?
не знаю есть ли это на Лисп, но когда мне нужно было реализовать подобное, то я использовал транзитную графику, т.е. просто поверх линии рисовал нужное.
__________________
_бложиг
Boxa вне форума  
 
Непрочитано 14.06.2019, 13:50
#3743
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Boxa Посмотреть сообщение
использовал транзитную графику
Читай = NET
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.06.2019, 13:57
#3744
Сергей812


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


Можно взять по сути готовый пример .Net, обернуть этот код в аля-лисп и вызывать из кода самого лиспа)
Сергей812 вне форума  
 
Непрочитано 14.06.2019, 14:03
#3745
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,069


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Можно взять по сути готовый пример .Net
пытался использовать этот код, не понравилось, не наглядно, нет возможности регулировать цвет, жирность или например подсветить не всю линию, а отступив по 100 от узлов...
Переписал именно на транзитную графику.
__________________
_бложиг
Boxa вне форума  
 
Непрочитано 14.06.2019, 14:24
#3746
T.Bagdat


 
Регистрация: 21.03.2013
Самара
Сообщений: 28


Сергей812, спасибо. А можно окончательно разжевать, для совсем не понимающих английский, что именно нужно сделать с этим кодом, чтобы он превратился в аля-лисп ?

Например, на сайте сказано, загрузить код в автокад и выполнить команду
Код:
[Выделить все]
(displayfullname "First" "Last")
Я попробовал сохранить код в формате .lsp и загрузить в автокад.
Код:
[Выделить все]
 using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
 
[LispFunction("DisplayFullName")]
public static void DisplayFullName(ResultBuffer rbArgs)
{
  if (rbArgs != null)
  {
      string strVal1 = "";
      string strVal2 = "";
 
      int nCnt = 0;
      foreach (TypedValue rb in rbArgs)
      {
          if (rb.TypeCode == (int)Autodesk.AutoCAD.Runtime.LispDataType.Text)
          {
              switch(nCnt)
              {
                  case 0:
                      strVal1 = rb.Value.ToString();
                      break;
                  case 1:
                      strVal2 = rb.Value.ToString();
                      break;
              }
 
              nCnt = nCnt + 1;
          }
      }
 
      Application.DocumentManager.MdiActiveDocument.Editor.
         WriteMessage("\nName: " + strVal1 + " " + strVal2);
  }
}
На что автокад мне выдал:
Код:
[Выделить все]
Команда: _appload DisplayFullName.lsp успешно загружено.


Команда:
nil
nil
nil
nil
nil ; ошибка: no function definition: DISPLAYFULLNAME
Как правильно обернуть такой код в лисп?

Или вот ещё, в этом примере код начинается [LispFunction("DisplayFullName")], а тот код, который нужен мне для подсветки сегментов начинается [CommandMethod("HighlightPolySeg")]. Это влияет на технологию подгрузки?

----- добавлено через ~5 мин. -----
Цитата:
Сообщение от Boxa Посмотреть сообщение
не знаю есть ли это на Лисп, но когда мне нужно было реализовать подобное, то я использовал транзитную графику, т.е. просто поверх линии рисовал нужное.
Я писал, что пытался рисовать отрезки поверх сегментов:
Цитата:
Сообщение от T.Bagdat Посмотреть сообщение
Пробовал рисовать поверх сегмента отрезок, и подсвечивать его. Но когда линия не сплошная, а с условными обозначениями, и включена генерация типа линий, то выглядит очень коряво.
Я не знаю, что такое транзитная графика, но если это что-то более изящное, объясните, пожалуйста, о чём речь.
T.Bagdat вне форума  
 
Непрочитано 14.06.2019, 14:30
#3747
Сергей812


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


Там не все надо копировать из первой ссылки. Это имя команды для вызова из комстроки, вообще не нужны эти строки. Что на входе в аля-лисп функцию будет - указан примитив (полилиния) и индекс сегмента для выделения или как?

----- добавлено через ~13 мин. -----
и код .Net сначала откомпилировать в сборку *.dll один раз и загружать потом вместе с lsp кодом основным.
Сергей812 вне форума  
 
Непрочитано 14.06.2019, 14:50
#3748
T.Bagdat


 
Регистрация: 21.03.2013
Самара
Сообщений: 28


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Что на входе в аля-лисп функцию будет - указан примитив (полилиния) и индекс сегмента для выделения или как?
По идее, так, наверное, правильнее всего. Но я себе не очень-то представляю, где взять индекс сегмента. Если для "POLYLINE" можно как-то по вертексам скакать с помощью (entnext), то для обычной "LWPOLYLINE" - это целая часть от параметра, полученного с помощью (vlax-curve-getParamAtPoint) или чего-то наподобие? Или прям есть такое свойство "индекс сегмента"?

А вот после чудесного слова "откомпилировать" мне прям совсем интересно стало

Последний раз редактировалось T.Bagdat, 14.06.2019 в 15:02.
T.Bagdat вне форума  
 
Непрочитано 14.06.2019, 15:34
#3749
Сергей812


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


Ну примерно так:

Код:
[Выделить все]
// Windows
using System;

// AutoCAD
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;


namespace HighlightSegmentPolyline
{
    public class HighlightSegPolyline
    {

        [LispFunction("HighlightPolySeg")]
        public static void HighlightPolySeg(ResultBuffer aArgs)
        {
            // Получаем текущий документ
            Document lAcadDoc = Application.DocumentManager.MdiActiveDocument;
            if (lAcadDoc == null) return;
            // Получаем БД текущего документа
            Database lAcadDb = lAcadDoc.Database;
            // Если были переданы два параметра
            if ((aArgs != null) && (aArgs.AsArray().Length == 2))
            {
                // Получаем массив аргументов
                Array lArgs = aArgs.AsArray();
                // Получаем Id полилинии
                ObjectId lId = (ObjectId)((TypedValue)lArgs.GetValue(0)).Value;
                // Получаем индекс сегмента
                int lIndexSeg = (Int16)((TypedValue)lArgs.GetValue(1)).Value;
                // **  Пошел код из первой ссылки -) **
                // Открываем транзакцию
                using (Transaction Tx = lAcadDoc.TransactionManager.StartTransaction())
                {
                    // Получаем полилинию
                    Polyline pline = Tx.GetObject(lId, OpenMode.ForRead) as Polyline;
                    // Если полилиния не замкнута (иначе от чего отсчитывать?)
                    if (!pline.Closed)
                    {
                        // Создаём subentpath для сегмента
                        FullSubentityPath path = new FullSubentityPath(new ObjectId[] { pline.Id },
                            new SubentityId(SubentityType.Edge, new IntPtr(lIndexSeg)));
                        // Подсвечиваем сегмент
                        pline.Highlight(path, true);
                    }
                    // Подтверждаем транзакцию
                    Tx.Commit();
                }
            }
        }

    }
}


Вызов из лисп-программы будет выглядеть (HighlightPolySeg %Примитив-полилиния% %Индекс сегмента для выделения (с единицы)%). Для теста:
Код:
[Выделить все]
 (HighlightPolySeg (car (entsel)) 3)
Выделяет третий сегмент выбранной полилинии. Если укажете не полилинию или невалидный индекс сегмента - это уже проблемы вашего кода, проверку соответствия типов не делал в коде. И добро пожаловать в .NETAPI. Расширяйте возможности привычного лиспа за счет вставок .Net кода)
Сергей812 вне форума  
 
Непрочитано 14.06.2019, 16:08
#3750
T.Bagdat


 
Регистрация: 21.03.2013
Самара
Сообщений: 28


С проверкой на валидность я справлюсь
А по поводу компиляции и подгрузки хотелось бы сразу уточнить. По ссылке, что вы привели, предлагают загрузить и установить некий ObjectARX. Если это необходимо для того, чтобы код у меня заработал, значит - это не мой случай. На работе нас правами на установку сторонних приложений не балуют. А если это всего лишь среда с базой дополнительных DLL, открывающих новые возможности для того же LISP, а ваш код будет работать и без неё, то подскажите, как и в чём его скомпилировать, и как подгрузить. Попробую скомпилировать его дома, и сбросить на рабочий комп.

В любом случае спасибо, что откликнулись, и нашли время на написание кода
T.Bagdat вне форума  
 
Непрочитано 14.06.2019, 16:21
#3751
Сергей812


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


Цитата:
Сообщение от T.Bagdat Посмотреть сообщение
По ссылке, что вы привели, предлагают загрузить и установить некий ObjectARX.
Не обязательно - берете одноименные *.dll из корневой папки акада (где лежит Acad.exe). Только компилировать нужно под ту версию и разрядность, которую в дальнейшем собираетесь использовать. NetApi менее капризнее, чем ObjectARX - поэтому откомпилированные сборки работают обычно на нескольких версиях акада подряд (с одним программным "ядром"), но пока разбираетесь - компилируйте под тот акад, который на рабочем месте. Можно просто библиотеки домой скопировать и там подключить и скомпилировать - если на работе не договоритесь поставить любую бесплатную студию)

----- добавлено через ~11 мин. -----
ну или вообще без студии - с помощью встроенного в сам .Net фреймворк компилятора командной строки csc.exe. Но проще все-таки студию поставить)

----- добавлено через ~20 мин. -----
а чтобы сборка загрузилась вместе с основной лисп-программой - можно тыц.
Сергей812 вне форума  
 
Непрочитано 14.06.2019, 16:45
#3752
T.Bagdat


 
Регистрация: 21.03.2013
Самара
Сообщений: 28


Сергей812, Покорнейше благодарю
T.Bagdat вне форума  
 
Непрочитано 02.08.2019, 19:24
#3753
superkot007


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


Подскажите, как разделить строку?
Строка типа "12x34-AB-56-CD лист 5", необходимо отбросить левую часть, оставив только "лист 5".
superkot007 вне форума  
 
Непрочитано 02.08.2019, 20:00
1 | #3754
Сергей812


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


Цитата:
Сообщение от superkot007 Посмотреть сообщение
Строка типа "12x34-AB-56-CD лист 5", необходимо отбросить левую часть, оставив только "лист 5".
Код:
[Выделить все]
 (substr "12x34-AB-56-CD лист 5" (1+ (vl-string-search "лист" "12x34-AB-56-CD лист 5")))
Сергей812 вне форума  
 
Непрочитано 02.08.2019, 20:33
#3755
superkot007


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Код:
[Выделить все]
 (substr "12x34-AB-56-CD лист 5" (1+ (vl-string-search "лист" "12x34-AB-56-CD лист 5")))
Все настолько просто?!
Подойдет для лиспа, спасибо!
Offtop: Я через vl-string->list, car, cdr, vl-list->string городить огороды начал...
superkot007 вне форума  
 
Непрочитано 02.08.2019, 20:45
#3756
Сергей812


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


И у лиспа есть функции работы со строками )
Сергей812 вне форума  
 
Непрочитано 02.08.2019, 21:08
#3757
superkot007


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


Сергей812, спасибо!
Есть в наличии http://www.private.peterlink.ru/pole.../Alisp2006.htm
Сейчас возникла необходимость написания лиспа - листаю, разбираюсь...

Еще вопрос - если не затруднит: как в лиспе сделать быстрый выбор всех полилиний (адаптирую polyline_coord под свои задачи).
Быстрый выбор ssget я понял. Не понятно, как потом "поштучно" из полученного набора вытаскивать по одному элементу на обработку.
superkot007 вне форума  
 
Непрочитано 02.08.2019, 21:22
#3758
Сергей812


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


Цитата:
Сообщение от superkot007 Посмотреть сообщение
Не понятно, как потом "поштучно" из полученного набора вытаскивать по одному элементу на обработку.
так откройте эту великолепную книжку) Метод ssname, например
Сергей812 вне форума  
 
Непрочитано 02.08.2019, 21:58
#3759
superkot007


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
так откройте эту великолепную книжку) Метод ssname, например
Так листаю ж, пишу))
Решил вопрос, оказалось, модификация не такая сложная.

Остался последний вопрос - как в лиспе получить имя и путь к файлу чертежа, из которого он запустился?
Необходимо сохранять файл извлечений с тем же именем, что и файл чертежа, и в ту же папку.

Можно, конечно, сделать "по классике":
Код:
[Выделить все]
 (open (getfiled "Select Text File" "C:\\" "txt" 1) "a")
скорректировать папку сохранения и ручками задавть имя, но хотелось бы полной автоматизации...

Последний раз редактировалось superkot007, 02.08.2019 в 23:12.
superkot007 вне форума  
 
Непрочитано 03.08.2019, 01:19
1 | #3760
skkkk

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


Цитата:
Сообщение от superkot007 Посмотреть сообщение
Остался последний вопрос - как в лиспе получить имя и путь к файлу чертежа, из которого он запустился?
Поскольку (как бы это правильней выразиться) лисп можно запустить только из текущего чертежа, то задача сводится к определению пути и имени текущего файла dwg. А они хранятся в системных переменных (только для чтения, ясен пень):
Код:
[Выделить все]
(getvar "DWGNAME")
(getvar "DWGPREFIX")
skkkk на форуме  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

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

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


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