|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
1 | | #1 |
Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)
ՃԱՐՏԱՐԱԳԵՏ, տ.գ.թ.
Торонто
Регистрация: 23.10.2007
Сообщений: 1,990
|
||
Просмотров: 2047183
|
|
||||
CAD Регистрация: 28.08.2003
Киев
Сообщений: 1,834
![]() |
Цитата:
![]() Вообще-то с точки зрения портного самая лучшая фигура - это половая щетка. Именно на ней он может показать всё своё искусство. ![]() >Red Nova Все простые примеры ты уже прошел? Из того же Хювенена, книги "САПР на базе..." и всё понимаешь? М.б. у автора этого текста (почерк в принципе заметен ![]() IMHO Но тут не комментарии нужны, это просто стиль программирования.
__________________
По теории майский жук летать не может. Но он этого не знает. И летает... Последний раз редактировалось Alan, 20.07.2008 в 21:30. |
|||
![]() |
|
||||
Alan,
Цитата:
Прочитал пока 1/3 книги, но и элементарного кода написать не смогу. Цитата:
Тогда давай так. Если есть время и желание поучить, то выложи пожалуйста простой лисп на твой взгляд, но так, чтобы в нем был выбор объекта (объектов), и работа со свойствами. И напиши к нему пошаговое пояснение (рассчитанное на полного чайника).
__________________
Блог |
||||
![]() |
|
||||
проектировщик газопроводов Регистрация: 04.08.2005
Петербург
Сообщений: 327
|
Может быть, попробовать другой учебник. Мне, например, понравился вот этот http://www.williamspublishing.com/Bo...59-0931-7.html
Несмотря на то, что там много ошибок в листингах. Но первые шаги очень даже помогает сделать. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Я не силен в объяснениях...
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Red Nova, #3: лично я начинал с командных методов. Потом - ent*- и vl*-операции. Сейчас смотрю по ситуации. Иногда ent* выгоднее (entmake, entmakex, entmod, entupd), иногда - activex.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
vic153,
Она платная, а я в другой стране жтиву. Может есть в общем доступе где? Кулик Алексей aka kpblc, Спасибо, попытаюсь из этого слепить что-то свое. Цитата:
__________________
Блог |
||||
![]() |
|
||||
Donhuan,
Я просто так ничего не понимаю, там ведь нет примеров для самого автокада. Думаю что мне нужны уроки на самом автокаде.
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Командные методы: это когда рисование (да и не только оно) выполняется через (command <...>) - то есть прямая передача команд в ком.строку.
Настоятельно рекомендую В.Свет "AutoCAD - язык макрокоманд и создание кнопок" и С.А.Зуев, Н.Н.Полещук (при участии П.В.Лоскутова) "САПР на базе AutoCAD - как это делается). Последнюю книжку надо читать вместе с любым руководством по адаптации AutoCAD'a (например, того же Н.Н.Полещука)
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
CAD Регистрация: 28.08.2003
Киев
Сообщений: 1,834
![]() |
Цитата:
В которой любезный kpblc много чего написал для начала работы с ЛИСП
__________________
По теории майский жук летать не может. Но он этого не знает. И летает... |
|||
![]() |
|
||||
Кулик Алексей aka kpblc,
Цитата:
Цитата:
Alan, Цитата:
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Да, в книге В.Света "не совсем" про Lisp. Но снять панику перед программированием поможет.
"САПР на базе AutoCAD" на ozon'e
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. Последний раз редактировалось Кулик Алексей aka kpblc, 21.07.2008 в 15:54. |
|||
![]() |
|
||||
Цитата:
![]() Цитата:
__________________
Блог |
||||
![]() |
|
||||
проектирование, обследование Регистрация: 22.10.2006
Днепропетровск
Сообщений: 115
![]() |
"САПР на базе Autocad" с инета вытягивал (только ж там не Полещук-Лоскутов, а ShaddyDoc в соавторстве с Полещуком).
Если вдруг не найдешь - пиши в ЛС сброшу
__________________
Мосты важнее, чем дома, они более святы, чем церкви, ибо сильнее объединяют.. ..они возводятся именно в тех местах, где сходится множество человеческих потребностей, они долговечнее других строений и никогда не служат какой-то скрытой или злой цели.. Последний раз редактировалось GlebbI4, 21.07.2008 в 15:11. Причина: уточнение авторов |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Общая справка: http://www.ozon.ru/context/help/#1687140
http://www.ozon.ru/context/detail/id/1687460/ - о почтовой доставке. http://www.ozon.ru/context/detail/id/1540982/ - о курьерской доставке. Способы оплаты: http://www.ozon.ru/context/detail/id/200890/ Честно скажу, цена на озоне не самая низкая, но как-то попривык я к нему... GlebbI4, ShaggyDoc и Сергей Александрович Зуев - один и тот же человек. И обрати внимание - я ж написал Цитата:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
проектирование, обследование Регистрация: 22.10.2006
Днепропетровск
Сообщений: 115
![]() |
Цитата:
Цитата:
__________________
Мосты важнее, чем дома, они более святы, чем церкви, ибо сильнее объединяют.. ..они возводятся именно в тех местах, где сходится множество человеческих потребностей, они долговечнее других строений и никогда не служат какой-то скрытой или злой цели.. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Судя по ссылке на книгу, она у них (на озоне то бишь) есть...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Кулик Алексей aka kpblc, Спасибо за ссылку.
GlebbI4, Пишу в личку.
__________________
Блог |
||||
![]() |
|
||||
Кулик Алексей aka kpblc,
А может на реальном примере поучишь? Вот к примеру задумка лиспа с выносками спдс. Для начало нужно выделить все выноски. Если следовать аналогии с твоим лиспом, то предполагаю что выноски можно выделить так. (Только не смейся) Цитата:
![]()
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Так не покатит (на форуме уже пробовали, простых путей там нет). Получение через ActiveX будет иметь смысл только при работе с файлом, содержащим внешние ссылки (из которых тоже надо будет получать выноски).
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Нам Xref не надо, так что через ent*.
Но давай не торопиться. Попытаюсь переварить. Цитата:
value - Входящие параметры tab item - локальные переменные Потом что-то не понятное... Потом опять что-то понял Цитата:
(vla-startundomark - Начальная метка для Undo (setq adoc (vla-get-activedocument (vlax-get-acad-object))) - Назначить переменной adoc чего-то там Ну и дальше много разных непонятных букв ![]() Можно разжувать?
__________________
Блог Последний раз редактировалось Red Nova, 22.07.2008 в 10:45. |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
_dwgru-conv-pickset-to-list - функция, преобразовывающая набор примитивов в список, который уже можно обрабатывать через foreach или mapcar. Там все достаточно просто: определяется длина набора (n), и это количество раз повторяется: добавить в список n-ный элемент набора; n уменьшить на 1.
Строки Код:
переменной lst присвоить список, полученный из набора. Предварительно из списка исключить все элементы, у которых тип (хранится в DXF-коде 0) не равен "spdsNotePosition".
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
А можно медленнее?
Я пытался написать свои предположения, но наверное не стоит, там все равно больше вопросов чем понятного. Когда будет свободное время напиши пожалуйста пояснение как в посте #5.
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Red Nova, Не с того конца подходишь. Для тебя пока vl-* и vla-* функции табу. Задание попроще:
1. Название команды - Колонна 2. Запрашивается у пользователя длина A и ширина B 3. Запрашивается точка вставки Pt 4. Точка вставки Pt считается центром прямоугольника AxB Пиши команду, рисующую колонну. Как минимум на одни грабли наступишь.
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Регистрация: 11.10.2004
e•burg
Сообщений: 755
|
VVA прав на 100% - нельзя начинать учиться игре в шахматы по партиям профессионалов (а приведённый Алексеем код - как раз этого уровня). Начинать надо с простейших примеров для начинающих, тем более, что почти все приёмы в них можно отработать не хуже, чем в самых замысловатых экзерсисах, но гораздо нагляднее. Предложенное задание с "колонной" - само то. Причём писать надо так, чтобы потом программу легко было дополнить например запросом и обработкой угла поворота "колонны". Для этого надо чётко разделять блок ввода с контролем корректности ввода, блок вычислений и блок рисования. Все блоки можно (и нужно) оформить в отдельные функции. Причём каждый блок может так же быть разделён на ещё более простые отдельные функции... Кажущаяся простота задачи обманчива.
![]() |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Про поворот колонны как раз было у меня в планах дальше
![]()
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
VVA,
![]() Знаешь ведь, что по любому не сумею. Ну хоть предположу, что на счет запроса ширины надо начать так, а что дальше, это пока для меня не реально. Код:
Похоже я пока еще ниже уровнем чем даже ты предположил.
__________________
Блог |
||||
![]() |
|
||||
Red Nova, я такой же "позорник" который до сих пор лиспом не владеет
![]() Мне вот тоже не помешало бы научиться...но то времени нет то желание пропадает то опять появляется... Книги у меня есть и не одна а толку мало... Может нам профессионалы тут будут давать практические задания, а мы попробуем учитьсяна них. Просто по голой книге учиться тяжело... А вот с "репетиторами"... ![]()
__________________
Поезд который устал от ржавого здравомыслия рельсов... |
||||
![]() |
|
||||
Например давайте попробуем написать программу складывающие 2 числа хранящиеся в однострочном тексте а результат поместить в 3й текст.
Какие функции необходимо использовать для такой программы? ЗЫ. программу нужно не оптимизированную, а максимально простую для понимания. без vl- vla- vlr и пр. ЗЗЫ. Также мне кажется не нужно писать нам готовую программу а потом ее разбирать. Нужно только показать куда копать и чем, естественно помагая в ошибках.
__________________
Поезд который устал от ржавого здравомыслия рельсов... |
||||
![]() |
|
||||
Shoorup,
У меня в последнее время есть и желание и время, только способностей маловато. По книге и я ничего не понимаю, вот и создал тему, с просьбой мастерам показать примеры на практике. Давай пока разберем пример от VVA (#25), потом приступим к твоему.
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Начало правильное.
Ширина колонны - число (будем считать всегда целое). Поэтому надо запросить не строку (getstring), а число. Найди нужное из ряда get* функций. Давай переменным будем давать осознанные имена. Newstring как-то не вяжится с шириной и числом вообще
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
подскажите мне по задаче из 31го поста.
Необходимые мне функции: + складывать чтобы atof - для преобразования строки в вещественное число numberp - для проверки. число выбрано или чтото другое ssget - для того чтобы получить список. Что еще забыл? и вообще правильно ли выбрал?
__________________
Поезд который устал от ржавого здравомыслия рельсов... |
||||
![]() |
|
||||
VVA,
Цитата:
__________________
Блог |
||||
![]() |
|
||||
VVA, наверно это getint?или getreal...
__________________
Поезд который устал от ржавого здравомыслия рельсов... |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
А также getsrting, getpoint
![]() В дополнение к #33: http://dwg.ru/f/showthread.php?t=5650 и http://dwg.ru/f/showthread.php?t=5887
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
конструктор Регистрация: 29.07.2005
Ростов-на-Дону
Сообщений: 1,092
![]() |
В dnl есть книга Финкельштейн "Autocad библия пользователя", так на диске к этой книге есть дополнительные главы про лисп как раз с такого типа примерами как колонна. Я по ней смог что-то для кружочков с цифрами буквами написать (маркеры осей) и еще такого типа. Дальше, к сожалению, не продвинулся. Там доступно и на примерах объясняют основы... Если в dnl нет диска к книге напишите - я выложу.
__________________
С уважением!!! |
|||
![]() |
|
||||
Инженер-теплотехник Регистрация: 17.08.2006
Смоленск
Сообщений: 308
|
Влезу, пожалуй, немного в обучение.
По задаче из #31. 1. Как будут выбираться тексты: по одному или оптом? Для этого можно использовать разные функции: ssget, entget. 2. Это уже как более опытные порекомендуют, но начинать следовало бы с функций, оперирующих dxf-кодами объектов (примитивов), пока не лезть во всякие vla- . 3. Попробуйте пока сделать программу без проверок на ошибки, используйте тестовый файл с точно известными и правильными объектами. Потом переходите на работу с другими файлами - по мере наступания на грабли будете узнавать как эти грабли отсекать. Итак получается: ssget, ssname, entget, assoc, atof, +, rtos, cons, subst, entmod ( или entmake). Кажется даже в порядке следования не ошибся. setq добавлять по вкусу. Насчет numberp: посмотрите внимательнее на работу функции atof. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Цитата:
Код:
![]() Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Дохлый номер - пытаться научиться на форуме, да еще в одной ветке. Научиться-то на форуме можно, но путем самостоятельного изучения литературы, справки и анализа публикуемых на форуме программ. Только хороших (например, от VVA). К тому же набегут другие со своими задачками. Кому сумму сделать, а кому и профиль одной кнопкой построить. Кто выяснять "кто здесь главный" и т.п. Будет "пожар в публичном доме во время наводнения".
Азбуку "побуквенно" разъяснять некому и некогда. Надо учиться работать. Поместил LISP в редактор VLIDE, выделил имя функции, нажал Ctrl-F1 и видишь справку по этой функции. Смотри, изучай аргументы, результаты, и как это использовано в разбираемой программе. Очень хорошее учебное пособие поставляется прямо с AutoCAD - в папке Tutorial\Visual LISP. Семь уроков - от самого простого до самого сложного. И всё разжевано в справке - раздел AutoLISP Tutorial. Эта справка есть и в русском варианте, kpblc её выкладывал где-то здесь. И делать свою программу, поначалу не разбрасываясь на другие. Колонна - очень хороший пример. Для развития. Сначала просто спросить размеры, направление и нарисовать прямоугольник. Потом догадаться, что размеры не обязательно каждый раз вводить, а можно по умолчанию предлагать. Потом выбор из типовых сочетаний. Потом не просто прямоугольник, а с решеткой, из уголков, из двутавров. Потом в 3D. И так до упора. А по ходу совершенствования этой программы можно научиться делать и сотни других. Разбить на логические блоки - начало, ввод, контроль данных, черчение, завершение. Не умеешь делать "хитрые" функции и не можешь пока понять, как они работают? Не страшно. Научись просто использовать готовые, например из библиотеки DwgRuLispLib И всё получится! |
|||
![]() |
|
||||
Люди добрые, подскажите где взять перечень функций лисп, весь Хювенен прошелся (Т1) там только Get, никаких подвариантов.
(Но только так чтобы было в свободном скачивании.)
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Red Nova, vlide -> F1. Там все (ну или почти все
![]() Shoorup, веришь - элементарно некогда ![]() ![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
ShaggyDoc,
Цитата:
__________________
Блог |
||||
![]() |
|
||||
ну хоть подскажи может я сам смогу ее сделать... не думаю что она ну очень сложная.
Например мне нужно при выборе текста однострочного получить ее коэффициент сжатия. Как это сделать?
__________________
Поезд который устал от ржавого здравомыслия рельсов... |
||||
![]() |
|
||||
А что такое Vlide?
__________________
Блог |
||||
![]() |
|
||||
ShaggyDoc,
Нашел. Это теперь тут AutoCAD 2009\Help файлы acad_alg.chm, acad_alr.chm, acad_alt.chm Почитаю
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
http://lisp.narod.ru/l1.html
http://aco.ifmo.ru/~nadinet/html/alisp.phtml в частности http://aco.ifmo.ru/~nadinet/html/lectures/lect_lsp.html и Глава4 http://www.ssga.ru/metodich/autocad/contents.html - ГЛАВА 12 FAQ по LISP писалось для версий Автокада 12-13, но на 95% справедливо и по сей день
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Регистрация: 11.10.2004
e•burg
Сообщений: 755
|
Цитата:
(cdr (assoc 41 (entget <имя примитива>))) Если в комстроке набрать vlide, то откроется встроенный в Автокад редактор, в котором и надо работать с исходиками АвтоЛИСП. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Это не форум, это филиал чата местного значения
![]() Цитата:
Код:
Цитата:
Visual Lisp Integrated Developmet Environment (вроде так расшифровывается): интегрированная среда разработки Visual Lisp. Также команда в AutoCAD. --- Мать моя... Сколько написали, пока я о телефону общался...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
VVA, Продолжим пример с колонной. Я нашел в хелпе весь список функций. От туда
Цитата:
Итак. Код:
К стати, а зачем после getreal ставить “T”?
__________________
Блог |
||||
![]() |
|
||||
Регистрация: 11.10.2004
e•burg
Сообщений: 755
|
Не надо при вызове getreal ставить T - работать не будет, это для getstring, чтоб пробелы можно было разрешить или запретить. Для задания размеров колонны в мм (которые не должны быть дробными) можно использовать и другую функцию. Дальше надо запросить следующие значения, которые идут по логике программы.
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
А еще лучше, наверное - в данном конкретном случае - сразу запрашивать прямоугольник )
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Далее надо задать вторую переменную, полагаю что так.
Код:
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
А если захочется вводить не с клавиатуры, а с экрана?
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Кулик Алексей aka kpblc, Ну ты хотя бы намеки давай какого типа функцию искать. Это же для меня планета Марс.
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Red Nova, см. (getcorner)
Shoorup, еще раз внимательно посмотри, что возвращает (entsel).
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Red Nova,
Хорошо. Пока будем считать, что пользователь вводит нужные нам данные с клавиатуры. В ответ на запрос (setq width (getreal "Введите ширину колонны <Выход>: ")) пользователь может ввести: 1. Пустой ввод (клавиша Enter) 2. 0 3. Положительное число 4. Отрицательное число Мы должны запретить вводить ему п. №№ 1;2;4. Т.е. только полижительные числа. Подсказка: см. ф-цию initget
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Кулик Алексей aka kpblc, entsel выдает имя выбранного объекта и координаты точки которые я указал на этом объекте. Получается мне мешают эти координаты?
т.е мне нужно сделать так Код:
__________________
Поезд который устал от ржавого здравомыслия рельсов... |
||||
![]() |
|
||||
Получилось!!!
надо так: Код:
__________________
Поезд который устал от ржавого здравомыслия рельсов... Последний раз редактировалось Shoorup, 22.07.2008 в 17:16. |
||||
![]() |
|
||||
VVA, Из справки
Цитата:
То есть где-то мы должны написать Код:
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Red Nova, #67
1. Initget действует на 1 запрос get* (getint, getreal и т.п. в helpe есть табличка) 2. Вытекает из п.1 перед каждым getreal. Запусти эти 2 строчки в VLIDE на выполнение и попробуй ввести что-нибудь недопустимое (кроме ESC)
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
VVA,
Тогда наверное лисп должен выглядеть так Код:
Цитата:
Цитата:
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Так
Код:
Дальше нужно запросить точку отрисовки и отрисовать колонну
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Молодец, Red Nova. Вопросы всё более разумные.
Совет: Сделай VLIDE своим постоянным инструментом. Может быть даже кнопочкой. Создай в редакторе пустой файл и вставляй в него фрагменты кода. Сохрани файл в папочку, созданную в "подходящем месте" под именем, например, "эксперименты.lsp". В дальнейшем все свои Лиспы сохраняй во всякие подпапки этой папки. Выделенные фрагменты кода из "экспериментов" отправляй на выполнение в AutoCAD кнопочкой "загрузить выделенный фрагмент". В окно "Консоль" будут возвращаться результаты. Их можно выделить и скопировать в окно программы и спрятать за комментариями. Чтоб наглядно видеть результат. Для начала можно и код более наглядно писать. Например, вводить переменные: Так пишет профи: Код:
Код:
Успехов! |
|||
![]() |
|
||||
VVA,
Думаю как-то так Код:
ShaggyDoc, Постараюсь работать с VLIDE, хотя пока совсем не понял что там к чему. Цитата:
__________________
Блог Последний раз редактировалось Red Nova, 22.07.2008 в 20:26. |
||||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
А вообще-то надо начинать не с кодирования, а с постановки задачи. То есть с составления "плана". Его можно сразу писать в иде комментариев, а потом постепенно реализовывать. Грамотная постановка - половина дела.
Например, для колонны сразу надо решать: 1. Одна ли это колонна, или целый ряд (одна как частный случай)? Как потом одну размножать, если ряд под каким-то углом? 2. Что это за точка вставки по отношению к самой колонне? Центр? Но центр не всегда известен, может быть и колонна с нулевой привязкой к оси. Тогда центр придется как-то еще вычислять. 3. Что это за "ширина" и "толщина"? У колонны есть два размера, но их надо как-то правильно назвать. Например "размер вдоль ряда", "размер поперек ряда". и т.д. Пиши сначала постановку, пусть примитивно. Например: Код:
|
|||
![]() |
|
||||
ShaggyDoc,
Ну этому тоже надо еще поучиться. Получается три из пяти пунктов уже реализованы.
__________________
Блог |
||||
![]() |
|
||||
Цитата:
Цитата:
Ну попробую обьяснить что называется "от чайника чайнику" ![]() 1. Нужна книга Полещука которая упоминалась выше. Там по каждой функции мало того что можно почитать но и увидеть вполне толковый пример. 2. Лично я разбираю с внутренних функций, т.е. то что будет выполняться первым. А первым будет выполняться (entsel). Как я писал выше этим мы получим уникальное имя и координаты туда где ткнули при выборе текста. Для профилактики вводи в комстроке по функционально и смотри что возвращает функция. (entget(car(entsel))) тут entget выведет нам все "свойства" выбранного объекта, но в качестве аргумента ему нужно имя выбранного объекта. А так как у нас (entsel) дает по мимо имени еще и координаты (которые мешают - слишком много аргументов)то их можно "отсечь" вот так: (car(entsel)) - тоже попробуй ввести с carи без и посмотри что возвращается. assoc 41эта функция вытянет нам необходимое свойство в виде точечной пары - в данном случае коэффициент сжатия. (assoc 41(entget(car(entsel)))) - вводишь это и тебе вернется (41 . 0.8) например - это точечная пара, про точечные пары читай Полещука там все очень понятно. Ну а так как нам нужно лишь получить коэфициент сжатия то нужно "отсечь" то что впереди. Делаем это с помощью cdr в итоге получим 0.8 Вот и всё! проще некуда ![]() ![]()
__________________
Поезд который устал от ржавого здравомыслия рельсов... |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
В дополнение к #74: раскрою "секрет", как я пишу свои лиспы. Сначала defun и придуманное имя функции. Потом в комментарии прописываю, что функция делает, какие параметры принимает, что возвращает. А там уже и код можно делать. В любой момент возвращаюсь в начало файла и смотрю - а то ли я делаю?
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Я - не пользуюсь.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Зачем блок-схемы? Это для первоклассников - чтоб на доске рисовать. Места много, толку мало. И не все выразишь. Алексей правильно делает - заготовка пустой функции, план в комментариях, потом реализация.
Цитата:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Позволю себе высказаться о последовательности разработки "сложения значений из 2 или более однострочных текстов или атрибутов":
1. Разработать или спереть функцию отлова ошибок (_ru-error-catch, _dwgru-error-catch) 2. Разработать или спереть функцию безошибочного указания примитива, возможно, с контролем возвращаемого типа. Сделать универсальной (т.е. дать возможность использовать и nentsel, при необходимости). 3. Решить раз и навсегда - функция будет обрабатывать 2 примитива? Или их надо указывать набором? В зависимости от этого будет немного меняться решение. 4. После п.3 написать часть получения текстовой строки (однострочного текста / атрибута) и перевода его в числовое значение. Ну и сложить. Сделать результат вычисления возвращаемым значением. 5. Написать общую функцию, которая загрузит все служебные функции и покажет результат. 5.1. Если результат надо выводить в однострочный текст, то потребуется функция создания однострочного текста. Подробности - самостоятельно (слишком много нюансов). 5.2. Если результат выводить в ком.строку или в alert - то все просто, но и это надо учитывать ![]() --- 6. Решить вопрос с предоставлением функции сторонним пользователям. Да и про себя, любимого, тоже забывать не след ![]() === "Зачем так сложно!?" Затем, что функция безошибочного указания примитива, скорее всего, понадобится еще не одну сотню раз. И функция отлова ошибок. Короче, "САПР на базе" в руки и вперед ![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
ShaggyDoc,
Цитата:
![]() Пока мне хотелось бы понять как задачку от VVA дописать в самом простом виде. Полистал я хелп и лиспики разные тоже, но пока не понял какие функции надо использовать, чтобы построить полилинию по координатам относительно центра вставки. Shoorup, Цитата:
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Red Nova, а ты как собираешься эту полилинию строить? Командой? entmake? vla?
Сильно подозреваю, что командой ![]() Переменные перевести в локальные обязательно! Потом можешь посмотреть на *error* и почти универсальный обработчик ошибок. --- Не, это точно чат! ![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Олег К.,
Мне VVA пока запретил vla-функции ![]() Про команду _.PLINE не очень понял, разве в программу аутолисп можно вписать обычную команду? Остается функция entmake. Почитаю про нее.
__________________
Блог |
||||
![]() |
|
||||
Кулик Алексей aka kpblc,
Цитата:
![]()
__________________
Блог Последний раз редактировалось Red Nova, 23.07.2008 в 10:08. |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
getpoint, getdist (для указания ширины и высоты), getvar, setvar, command
Для вычисления точек пока используй напрямую setq и результат подставляй в command. Как вариант, без учета поворота: Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Кулик Алексей aka kpblc, Если честно, ты мне обломал урок,
![]() Цитата:
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Код сделал прежде всего для анализа
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Red Nova, Продолжим. Сейчас мы имеем такой код
Код:
1. Мы не знаем vla-* функций (не можем обработать ESC) 2. Мы даже пока не знаем, что такое dxf коды ![]() Цитата:
Остается пока Цитата:
Пару критических замечаний по существующему коду: 1. Мы ф-цией (initget 7) запрещаем пустой ввод. Поэтому здесь "Введите ширину колонны <Выход>: " - <выход> не уместен. А вот в getpointe мы пустой ввод не запрещаем, запрещать не будем, а выход заменим на 0,0. Т.е. задача такая: В случае нажатия ENTER на запрос getpoint присвоить переменной base точку с координатами 0,0
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 31.07.2008 в 10:41. |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Анализ показал, что колонна всегда будет смотреть в одну сторону.
![]() Цитата:
Попробуйте-ка что-нибудь нарисовать на другом языке высокого уровня, и даже на LISP, но вне Автокада. |
|||
![]() |
|
||||
VVA,
Ты хороший педагог. Цитата:
Цитата:
Из справки Цитата:
Думаю надо так Код:
Код:
__________________
Блог |
||||
![]() |
|
||||
А в чем смысл сдвоенной скобки?
И зачем тут Цитата:
__________________
Блог Последний раз редактировалось Red Nova, 23.07.2008 в 14:38. |
||||
![]() |
|
||||
Регистрация: 11.10.2004
e•burg
Сообщений: 755
|
Функция cond обрабатывает аргументы, как списки. Если список, возвращает nil, переходит к следующему спску, если возвращено не nil, то полученное значение возвращается без обработки следующий списков. Список обрабатывается следующим образом - вычисляется первый элемент списка, если он не nil, то вычисляются все последующие элементы списка, последний вычисленный элемент возвращается. В случае:
Код:
Код:
|
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Все-таки советую больше внимания уделить продумыванию алгоритма. Например, само рисование колонны. Вроде бы прямоугольник. Но из чего? Можно из отрезков, а можно полилинией. Можно и залитый, а можно и прозрачный. У колонны могут еще и свои "осики" быть. Двухветвевой она может быть или сплошной.
Приведу пример, как колонны в ruCAD рисуются в 2D. Сначала выбор из иллюстрированного меню (прилагаю скриншот). Там сразу выбирается типоразмер и вид колонны. Не обязательно самому именно такое меню делать, можно и просто в AutoCAD-овское встроить. А вот протокол работы после выбора типа: AutoCAD спрашивает: Пролет=6000, Количество=1. Точка начала ряда [Пролет/Количество]<Выход>:К То есть можем нарисовать и одну, и целый ряд с заданным пролетом. Можем сразу указать точку, а можем выбрать опции Пролет или Количество или просто нажать Enter и закончить работу. Допустим, ввели опцию К (можно из автоматически сформированного контекстного меню, можно с клавиатуры). Тогда спросит: Количество [Указать]<1>:5 После ввода количества возобновляется допрос: Пролет=6000, Количество=5. Точка начала ряда [Пролет/Количество]<Выход>: Укажем точку. Тогда вопрос: Направление ряда: Здесь надо указать точку. После того рисуется целый ряд колонн (см. рис), и снова вопросы: Пролет=6000, Количество=5. Точка начала ряда [Пролет/Количество]<Выход>: То есть можно и еще несколько рядов указать. Или сделать пустой ввод и закончить программу. Вот это как бы постановка задачи - что надо получить и как должно работать. Разумеется, могут быть и другие варианты. А вот и программирование: Всего одна строчка, вписываемая в меню. Код:
Такой вызов легко модернизирует любая "тетка". Меняй 500 и 1000 на другие значения и будешь иметь кучу "команд". Если же надо сплошную колонну 600х600, вызов немного другой: Код:
И вообще это совсем не обязательно для колонн, а для чего угодно подходит, где надо любое изображение с заданными габаритными размерами нарисовать сколько-то раз с заданным шагом. Картошку, например, рассадить. Само же кодирование дело более техническое. Конечно, там нужны и знания и мастерство, но это всё-таки труд для "Microservs". Хорошую постановку задачи потом легче и реализовать в коде. Последний раз редактировалось Кулик Алексей aka kpblc, 14.08.2008 в 16:08. |
|||
![]() |
|
||||
ShaggyDoc,
Цитата:
__________________
Блог |
||||
![]() |
|
||||
VVA
Почитал немного про command Из хелпа Цитата:
Х pt1 =Х base – (dimensionX/2) Y pt1 =Y base – (dimensionY/2) И так далее для всех точек. Теперь попробую это представить как лисп выражение Код:
Затем Код:
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Ты с cond разобрался? Еще можно было использовать оператор if
По поводу точек. В общем все правильно, за исключением ошибок, на которые указал Олег К., Мой вопрос красным Код:
Здесь нужно учитывать особенности лисп при приведении типов Выполни у себя в редакторе и сделай выводы Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
VVA,
Про вопрос красным. Я ошибочно полагал, что содержимое List должно находится в скобках. Цитата:
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Здесь я дал задание. Оно относится и к тебе. Внимательно почитай про функции.
"Красный" вопрос пока остается. Почитай (с разбором каждой главы в vlide) и попробуй еще раз ответить. По поводу (/ 1 2) и (/ 1 2.0) - здесь вопрос приведения типов. 1. Если ЦЕЛОЕ делится (умножается) на ЦЕЛОЕ, то получается ЦЕЛОЕ (целое от 0.5 - 0) 2. Если ЦЕЛОЕ делится (умножается) на ВЕЩЕСТВЕННОЕ, то получается ВЕЩЕСТВЕННОЕ (это то, которое real) Это я к тому, что в этом месте Код:
Код:
Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
И вообще для колонн размер надо задавать сразу REAL. Мало ли что чаще всего они выражаются в целом количестве миллиметров. А если понадобится работать в единицах "метры"? Если на плане сетей надо будет колонну поставить? Да и вводить данные удобнее - можно getdist использовать.
|
|||
![]() |
|
||||
Инженер-теплотехник Регистрация: 17.08.2006
Смоленск
Сообщений: 308
|
>> Shoorup
Выполни в редакторе вот такие выражения: (list ((* 5 2) (/ 8 4))) (list (* 5 2) (/ 8 4)) (list '(* 5 2) '(/ 8 4)) и посмотри чем отличаются результаты. При вычислениях лучше перебдеть (ведь пока нет отлова ошибок?) и делать явно задаваемые числа вещественными. Не помню, говорили ли здесь, в vlisp'e есть хорошие возможности проверки кода на ошибки. Самые простые на панельке "Tools" (в стандартном виде - третья слева во второй строке). На код из #100 точно бы 2 раза ругнулся. |
|||
![]() |
|
||||
Регистрация: 27.12.2007
Сообщений: 132
![]() |
Добрый день, полезная тема, тоже как раз начал изучать лисп.
Прделагаю начать с самого простого а потом усложнять. А то для начинающих сложно освоить все сразу. Давайте вернемся к простой задаче Цитата:
![]() Код:
Теперь можна усложнять. Постепенно. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Нужно подождать пока Red Nova и Co подтянуться. А тебе пока нужно
1. На запрос ширины и длинны запретить пустой ввод,ввод отрицательных чисел и 0 2. На запрос точки на ввод по умолчанию принять координату 0,0,0.
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Регистрация: 27.12.2007
Сообщений: 132
![]() |
Цитата:
+заментил getreal на getdist, чтоб ширину и высоту можна было на экране указать, нормально будет? Код:
|
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
andery, Нормально.
Для проверки на пусто (nil) есть функция null т.е. (if (= p nil) ... можно еще записать как (if (null p) ... Ну и еще наиболее частые связки car и cdr уже есть ввиде отдельных функций (car (cdr p)) = (cadr p) Читать нужно с конца: к списку p применить cdr потом car (cADDARr p ) = (cAr (cDr (cDr (cAr p)))) Код:
Теперь давай запросим угол поворота и повернем колонну относительно точки P на этот угол. PS P не объявлена в локальных переменных
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Инженер-теплотехник Регистрация: 17.08.2006
Смоленск
Сообщений: 308
|
Выполняется указание точек в чертеже. Наверное, в функции initget стоит использовать и bit 8.
VVA, вопрос. Если использовать (if (null (setq p (getpoint "\nУкажите центр колоны:<по умолчанию (0,0)>"))) (setq p '(0 0 0))) всегда ли в условии при пустом вводе будет nil? Что-то сомнения иногда бывают. Последний раз редактировалось Олег К., 24.07.2008 в 17:11. |
|||
![]() |
|
||||
VVA И так на данный момент код у меня такой
Код:
Про вопрос красным я понял. Про реальные и вещественные вроде тоже. P.S. А учеников у тебя все больше. ![]() ------------------------ Опоздал, уже дал задание про поворот. Про P не понял. Цитата:
__________________
Блог Последний раз редактировалось Red Nova, 24.07.2008 в 17:57. |
||||
![]() |
|
||||
Ну повернуть можно командой rotate, а как выбрать то что мы будем крутить не знаю. Поищу в книгах.
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Олег К., Не вижу причин чтобы не работала. Хотя я предпочитаю такие конструкции (для меня нагляднее)
Код:
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 17.12.2016 в 19:52. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Red Nova, У тебя код не рабочий. Читай замечания Олег К. #101,
Локальные переменные описываются после слэша при определении функции. Выделил корасным Код:
Кстати проверить значение переменной можно, набрав в командной строке Автокада ! (восклицательный знак) и имя. Если загрузить команду Колонна, то Цитата:
В команде TEST2 переменная rez не объявлена локальной Код:
2. Выполняем TEST1 3. Набираем в командной строке !rez 4. Выполняем TEST2 5. Набираем в командной строке !rez 6. Смотрим на разницу и делаем выводы Цитата:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Цитата:
Цитата:
---------------------- Пробую в автокаде, рисую что-то, потом команда rotate, затем ввожу p, результата нет. ![]()
__________________
Блог |
||||
![]() |
|
||||
Регистрация: 27.12.2007
Сообщений: 132
![]() |
Да я тож застрял на Ротате.
![]() Мне не понятен синтаксис вызова команды Например (command "_rotate _L или (command "_rotate "_L" где об этом почитать можна прочитал что _L последний нарисованный обьект.... Подскажите в каом русле двигаться.... |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Мы ее (колонны) только что отрисовали и ни одна команда редактирования с ней не работала. Предыдущего (текущего, последнего) набора нет. Так что P (Previous), он же текущий-предыдущий-последний не пойдет. Штудируйте командную строку.
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
ПРАВИЛО
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 31.07.2008 в 10:53. Причина: Список |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
andery,
При передаче параметров ф-ции command нужно соблюдать последовательность запросов вызванной команды, причем
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 25.07.2008 в 10:50. Причина: Список |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Ручками что ты дальше делаешь? Нажимаешь или ENTER или ПКМ. Так и скажи об этом command'у чтобы он нажал тоже
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
andery,
1. getpoint у тебя что запрашивает? - ТОЧКУ 2. В какую переменную ты ее запоминаешь? - в P Если у тебя в переменной P находится ТОЧКА и _rotate запрашивает "Базовая ТОЧКУ" какого ляда вы занимаетесь мазохизмом? Код:
(setq p (list 1 2 3)) - точка с X=1 Y=2 Z=3 (setq p '(5 3 0)) - точка с координатами X=5 Y=3 Z=0 (command "_Rotate" "_L" "" '(2 3)) - начнет поворачивать последний отрисованный объект относительно точки X=2 Y=3 ТО же самое (setq p (list 2 3)) (command "_Rotate" "_L" "" p)
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Ты совсем не мешаешь. Не могу же я один всех учить. Тем более скоро возьму оставшуюся часть отпуска
![]()
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
конструктор Регистрация: 29.07.2005
Ростов-на-Дону
Сообщений: 1,092
![]() |
Red Nova
Вот те примеры и текст, что обещал
__________________
С уважением!!! Последний раз редактировалось Кулик Алексей aka kpblc, 14.08.2008 в 16:08. |
|||
![]() |
|
||||
конструктор Регистрация: 29.07.2005
Ростов-на-Дону
Сообщений: 1,092
![]() |
И последняя, саму книгу можно взять в DOWNLOAD
__________________
С уважением!!! Последний раз редактировалось Кулик Алексей aka kpblc, 14.08.2008 в 16:08. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
andery, Молодца. Quote и ' равнозначны (а набирать быстрее)
(setq p (quote (0 0 0)) = (setq p '(0 0 0)) Усложним задачу. 1. Рисуем колонну 2. В центре колонны рисеум круг радиусом=ширине колонны 3. Поворачиваем колонну PS По прежнему переменная P у тебя глобальная
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
VVA, Извиняюсь за отсутствие, дома телефон зарубили, а инет на нем.
Наверстываем упущенное. Итак командой _L можно выбрать только что созданный объект (к стати а что означает L?) Попытаюсь без подглядывания. Пока не учитывая #134 Код:
__________________
Блог Последний раз редактировалось Red Nova, 25.07.2008 в 10:08. |
||||
![]() |
|
||||
VVA,
Цитата:
Но могу так. (сперва добавив локальную переменную R) Код:
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Red Nova,
Цитата:
Цитата:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Подсказка: entlast
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Почитал хелп, не скажу что понял, но вроде как можно присвоить переменной обозначение только что введенного объекта.
Может так? (предварительно объявив локальную переменную object) Код:
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Н.Н.Полещук - любая книга по AutoLISP и VisualLISP.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
VVA
Проверку не прошел. Загрузил такой лисп Код:
Цитата:
![]()
__________________
Блог |
||||
![]() |
|
||||
Кулик Алексей aka kpblc,
Ты про Цитата:
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Нет, я про Visual LISP и секреты адаптации AutoCAD и AutoLISP и Visual LISP в среде AutoCAD (+ CD-ROM)
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
2-я ссылка сверху. Скачать все. Оттуда можно попасть сюда: entlast в главе 5
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Инженер-теплотехник Регистрация: 17.08.2006
Смоленск
Сообщений: 308
|
>> Red Nova
А скобки кто проверять будет? У тебя же в COND два условия используются, так почему второе в скобках, а первое без? Код:
>> VVA Все ждал когда ученики сообразят с выделением колонны, наверное уже можно отвечать? Пока нашел только три способа: командой создать именованный набор, использовать ssget с несколькими фильтрами, запомнить имя функцией entlast. Entlast'ом проще и надежнее, но с ssget'ом тоже интересно повозиться. Получилось такое: (ssget "W" (list (- x1 1) (- y1 1)) (list (+ x3 1) (+ y3 1)) '((0 . "lwpolyline"))) но это только для данного случая и предварительно отключив привязки. PS: самому иногда интересно решить поставленные задачи, можно узнать что-нибудь новое. Последний раз редактировалось Олег К., 25.07.2008 в 12:01. |
|||
![]() |
|
||||
VVA,
Проглядел. От туда Цитата:
![]()
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Делаем следующее
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 26.07.2008 в 22:17. |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
В процесс обучения не вмешиваюсь, но
Цитата:
При неконтролируемом рисовании можно до него запомнить последний примитив в переменной через (entlast) а потом использовать функцию наподобие Код:
Код:
|
|||
![]() |
|
||||
Инженер-теплотехник Регистрация: 17.08.2006
Смоленск
Сообщений: 308
|
ShaggyDoc, не скромничайте, Ваши замечания всегда полезны начинающим (и не только).
Кажется, я малость ошибся, в первом случае имелись в виду группы (command "group"), постоянно путаю их с наборами (ssget). Нечто вот такое: Код:
Про выбор рамкой я не зря сказал "только для данного случая", когда на чертеже только квадрат полилинией и круг. Сам всегда долго думаю как составить фильтр, чтобы отсеять все ненужное. |
|||
![]() |
|
||||
Олег К.,
Внес твою поправку. Ты и раньше говорил, а я забыл... VVA, По поводу отслеживания ошибок, спасибо за пояснения. Принцип ясен. Но понять почему радиус не принимается равным переменной R это не помогло. Я исправил cond, но как уже сказал с радиусом неполадка. А квадрат рисуется нормально. Код:
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
А osmode кто отслеживать будет?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Кулик Алексей aka kpblc,
Цитата:
![]()
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Кулик Алексей aka kpblc,
Может там и описывается нужная операция, но слова osmode там нету, я пока в ауте. Что вообще означает отследить osmode? Олег К., Неа, не понимаю.
__________________
Блог |
||||
![]() |
|
||||
Инженер-теплотехник Регистрация: 17.08.2006
Смоленск
Сообщений: 308
|
Ну ладно, тогда по буквам:
(command "_circle" base "" R "") 1. сначала говорим какую команду используем ["_circle"], это равнозначно Command: ci CIRCLE 2. далее нужно указать точку центра или выбрать опцию [base] = Specify center point for circle or [3P/2P/Ttr (tan tan radius)]: 0,0,0 3. потом следует ввести радиус [Specify radius of circle or [Diameter] <96.20>: 20], а у нас в программе зачем-то пустой ввод [""] 4-5. все, запросы команды закончились, а мы задаем еще R и "". Энтер или пробел нужно нажимать только если вводишь данные с клавиатуры. При программном вводе подтверждение ввода совсем не нужно. В рабочем варианте: (command "_circle" base R). Еще есть такая функция vl-cmdf, почитай о ней, посмотри чем отличается от command. |
|||
![]() |
|
||||
Engineer Регистрация: 05.09.2003
New-York
Сообщений: 10,288
|
По-моему, при такой интенсивности обучения у RED Nova не остается времени на домашнюю аналитическую работу. Он бы и сам допер до некоторых вещей, что было-бы более ценно. Предложение такое: класс по программированию работает, например, по пятницам. Или дважды в неделю. И все-учителя и ученики - ждали бы с нетерпением
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Red Nova, а я зря дал ссылку в #155, что ли? Пост Alan'a прочти.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Олег К.,
Теперь понял. А я все пытался enter всунуть. Наконец заработало. Код:
Цитата:
Vova, Цитата:
![]() Кулик Алексей aka kpblc, Вот сообщение от Alan Цитата:
__________________
Блог |
||||
![]() |
|
||||
Пора усложнить лисп. Научится вводить размеры колонны с экрана, Запоминать значение введенное последним. Дайте список функций, которые нужно для этого изучить. Постараюсь сам навоять.
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
> #161 : лично я стараюсь не давать русских наименований ни переменным, ни функциям. Возможно, это тянется еще с VB3.0 и его ограничений.
Вся разница между (command) и (vl-cmdf) в том, что (command) всегда возвращает nil (независимо ни от чего), а vl-cmdf при успешном (или корректном) завершении команды вернет T. Это утверждение гарантированно работает только для полного AutoCAD, для LT и IntelliCAD'a это уже не факт. Цитата:
Код:
> #162 : Я б на твоем месте сначала с *error* разобрался. А экранный ввод уже потом. Хотя как знаешь. Для ввода с экрана см. getdist и (или) getcorner. Для всего остального функции lisp'a уже не требуются.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
А что на счет error? Что означает "Разобраться с ним", в каких целях это вообще делать?
__________________
Блог |
||||
![]() |
|
||||
CAD Регистрация: 28.08.2003
Киев
Сообщений: 1,834
![]() |
Цитата:
Лучше всего посмотреть уже упоминавшуюся книгу "САПР на базе..." стр.286
__________________
По теории майский жук летать не может. Но он этого не знает. И летает... |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
В дополнение: http://www.arcada.com.ua/forum/viewtopic.php?t=445
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Ну что ж. Начнем наступать на ГРАБЛИ №1 (OSMODE)
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось Кулик Алексей aka kpblc, 14.08.2008 в 16:08. |
|||
![]() |
|
||||
VVA,
Подозреваю, что ты имел в виду необходимость отключить привязки на момент действия лиспа, так как при запросе угла поворота они могут помешать.
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Код:
Отсюда еще пару мельких наводящих заданий:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
VVA,
Цитата:
Цитата:
Цитата:
http://dwg.ru/f/showthread.php?p=271243
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Red Nova, Ты хочешь сказать, что из поста #167 открыв файл "Грабли N1", установив OSMODE=33, задав ширину и высоту колонны = 400 и точку вставки- пересение красных отрезков получил колонну прямоугольную ?
Еще остался вопрос N3 из #169
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Цитата:
Цитата:
__________________
Блог Последний раз редактировалось Кулик Алексей aka kpblc, 14.08.2008 в 16:08. |
||||
![]() |
|
||||
andery,
Скорее всего "osmode" 0 Код:
Цитата:
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Red Nova,
Цитата:
andery, Это все надо делать руками. См. #167. Это просто пимер того, что может произойти, если не обрабатывать OSMODE Red Nova, Цитата:
И это один вариант. Я хочу услышать ответ как без ЛИСПА, F3 и проч. при черчении отменить действие установленных объектных привязок. (Подсказка: временная объектная привязка или SHIFT + Правая кнопка мыши)
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 28.07.2008 в 15:18. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
andery, Ты не правильно понял задачу. Это не задача вовсе, а попытка показать пример, что может быть, если не обрабатывать OSMODE
Отредактировал условия в #167. Это все нужно просто выполнить на своем компьютере и посмотреть на результат.
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
VVA,
Цитата:
Цитата:
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
andery, Да, это правильный результат. Вот эти грабли мы и будеи преодолевать. (Только пересохрани в формате 2004 Автокада, а то не все смогут открыть)
Цитата:
Цитата:
Т.е. получается, что в ответ на запрос командой точки (будь то _line, _circle или _pline) можно вводить выделенные жирным опции, как то _endp, _non и т.д. Раз мы можем вводить это руками, значит мы можем это передать и в command. Т.е. вырисовывается 2 способа борьбы с "OSMODE" 1. Сохранить в переменную, обнулить (или отключить), а потом восстановить 2. Перед вводом каждой точки в command временно отключать привязку с помощью опции "_non" Хочу увидеть оба варианта в лиспе
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 28.07.2008 в 17:22. |
|||
![]() |
|
||||
VVA,
Первый вариант ты уже видел Код:
Код:
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
И не совсем верный второй вариант. Надо:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Кулик Алексей aka kpblc,
![]() ![]()
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Red Nova, Алексей уже подсказал. Я нужное слово выделил в #181 поярче.
Давай остановимся на 1-м варианте. Покажи код целиком, чтобы идти дальше. *** Добавлено andery, В принципе не обязательно, если в переменной R - число. Но в Автокаде радиус можно "показать" 2-мя точками. Просто нужно отдавать себе отчет, что у тебя в переменной R.
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
VVA, Учитывая отслежку Osmode
Код:
__________________
Блог |
||||
![]() |
|
||||
andery,
Подозреваю что далее у нас урок обработки ошибок методом переопределения функции error
__________________
Блог Последний раз редактировалось Red Nova, 28.07.2008 в 22:35. |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Ссылка на пример переопределенного обработчика уже была
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Цитата:
Есть 2 варианта: 1-й как показал Алексей здесь можно ГЛОБАЛЬНО переназначить обработчик ошибок: создать свою функцию с 1-м аргументом (см. (defun kpblc-error (message) ... по ссылке присвоить стандартному обработчику указатель на свой обработчик ошибок. Пример ф-ции приведу здесь ;| Код:
Суть его в том, что мы не сохраняем и восстанавливаем глобально ф-цию *error*, а объявляем ее ЛОКАЛЬНОЙ переменной и в теле самой ф-ции объявляем ф-цию *error*. Т.е конструкция принимает вид Код:
Здесь есть еще один нюанс: Всем КРАСНЫМ ф-циям, объявленным внутри СИНИХ функций доступны ЛОКАЛЬНЫЕ переменные СИНИХ функций как ГЛОБАЛЬНЫЕ. Я могу спокойно проверять значение переменной, объявленной как локальная в ф-ции верхнего уровня (СИНЕЙ) Код:
Ну вот попытался в картинках объяснить как это работает. Хотелось бы увидеть команду КОЛОННА с *error* по 2-му варианту
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 29.07.2008 в 00:14. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Следующим шагом рекомендовал бы заняться метками отмены
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Понять бы еще что значит (msg)
Код:
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
поставь точку останова и выполняй пошагово
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Мы добились главного. Если пользователь прервет ф-цию, то восстановятся объектные привязки до вызова команды Колонна. Для иллюстрации примера делаем следующее:
Задание для самостоятельной работы: Написать функции disable_osmode - Функция отключения режима(ов) объектной привязки enable_osmode - Функция включения режима(ов) объектной привязки В справке про OSMODE об этом написано.
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Регистрация: 27.12.2007
Сообщений: 132
![]() |
У меня такие вопросы по поводу Граблей№1,
1.Зачем делать osnapcoord=0 ? Ведь "наступаем" на грабли тока при этом значении. 2.Не лучше ли делать osnapcoord=1 (1 - Ввод с клавиатуры пере регулирует установки объектной привязки., ведь при этом у нас никогда "не убежит" точка, т.к. мы ее вводим "вручную")? А потом возращать прошлое значение. 3. Если делаем колонну, зачем osmode делать 0 ? А если пользователь при вставке колонны хочет пользоваться привязками? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
"А если пользователь хочет пользоваться привязками" - то надо либо отключать их только на момент рисования, либо вообще использовать некомандные методы.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
1,2. Это дело вкуса. Можно делать и так. Это просто пример. Можно вообще использовать некомандные методы и забыть про привязку. Плюс еще OSNAPCOORD появилась в 13-й версии Автокада, а я эти проблемы решал в 10-й версии. Привычка.
![]() 3. А никто не застявляет обнулять OSMODE сразу как запомнили значение. Можно обнулить перед вызовом _PLINE. Это так Red Nova захотел, а пользователь andery указал ему на этот СУЩЕСТВЕННЫЙ недостаток. Неудобно пользоваться командой Колонна, так как невозможно привязаться к существующему пересечению осей. Ну и наконец привязку можно ОТКЛЮЧАТЬ
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Регистрация: 11.10.2004
e•burg
Сообщений: 755
|
Скорее всего, ни в каком (не проверял), но... есть ещё момент - при написании любых программ, одним из важнейших правил является минимизация вемешательства в среду исполнения, т.е. по окончании работы нашей программы, то место, где она работала (в случае АвтоЛИСПов, это Автокад) должно функционировать ровно так же, как и до запуска. В принципе, манипуляция с переменными osmode и osnapcoord вполне сопоставима - в любом случае менять их надо только на момент программного рисования и сразу по его окончании восстанавливать в первоначальное состояние, но опять же есть нюанс - традиционно для таких манипуляций используется именно osmode, в том числе потому, что управлять привязками умеет любой пользователь, а вот о osnapcoord и её действии большинство пользователей даже и не подозревает. Соответственно, если чтото пойдёт наперекосяк, а рано или поздно таки случится чтото такое, от чего не спасут самые изощрённые меры предосторожности, то пользователю гораздо проще восстановить привязки, чем управление приоритетом ввода.
|
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
А до некомандных методов обучение еще дойдет. Там и с *error* решать иначе нужно. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
andery, #201 Незачтено. Причина: читай #203
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
VVA,
Цитата:
Код:
Код:
Нужно функцией IF создать две ветки программы. Проверяется значение osmode, если оно меньше 16384, то выполняется первая функция, иначе вторая. Но вот как проверить это условие? Цитата:
andery, Главный смысл научится это все делать, лично мне тоже здесь не нужно возится с Osmode, но знать надо. Кто знает какая переменная в будущем может помешать.
__________________
Блог Последний раз редактировалось Red Nova, 29.07.2008 в 12:30. |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Red Nova, #206 Незачет
1. Я просил фукции, а не команды 2. Уж если и команда, то enable_osmode определена неправильно. 3. Цитата:
Цитата:
Так вот жетон - это АРГУМЕНТ функции ТУРНИКЕТ. Т.е. АРГУМЕНТ - ОБЯЗАТЕЛЬНО ПЕРЕДАВАЕМЫЙ ПАРАМЕТР функции. (турникет жетон) - вошли в метро (турникет) - ошибка, мало передано параметров (турникет жетон сумка) -ошибка, много передано параметров. Нужен только жетон
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
VVA,
Цитата:
![]() Цитата:
![]()
__________________
Блог |
||||
![]() |
|
||||
andery,
Цитата:
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
andery, Это условие (= (getvar "osmode") (- (getvar "osmode") 16384)) ВСЕГДА будет ложь (nil). Поэтому рисать if не имеет смысла.
Этот вариант будет всегда делать то же, что и твой Код:
1. Если хочешь напечатать в командную строчку - используй ф-цию princ 2. Господа, я просил ФУНКЦИЮ, а не КОМАНДУ PPS Напишите мне словами алгоритм работы функции disable_osmode.
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
andery, Это уже кое-что
Только нужно учесть PS №1 и 2 из #213
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
VVA,
Можно попробовать и без переменных. Код:
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Ага. А теперь еще сюда же добавить clayer, celtscale, celtype и до кучи еще пару-тройку переменных. И подумать, как нарисовать код покороче.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Кулик Алексей aka kpblc, Расшифруй.
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Red Nova, Синтаксис Пушкин должен соблюдать?
Если внимательно посмотреть на коды режимов объектной привязки, то можно заметить, что там идет степень двойки. Т.е. устанавливается в 0 или 1 соответвующий бит. Тогда ф-ции можно записать так Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Цитата:
__________________
Блог |
||||
![]() |
|
||||
Пытаюсь понять что это значит
Цитата:
__________________
Блог |
||||
![]() |
|
||||
Инженер-теплотехник Регистрация: 17.08.2006
Смоленск
Сообщений: 308
|
То ли я чего-то пропустил, но:
Цитата:
Код:
И еще. Red Nova и andery внимательнее к цифрам, что означают "1684" и "16383"? Привязки с битом =0 нет (есть "отсутствие" привязки), так что больше или меньше 16384. Последний раз редактировалось Олег К., 29.07.2008 в 16:47. |
|||
![]() |
|
||||
Олег К.,
Цитата:
Цитата:
__________________
Блог |
||||
![]() |
|
||||
VVA
Я застрял. ![]() Сразу куча непонятного. 1. Что значит следить за синтаксисом. (где я ошибся?) 2. Что делают ф-ии logior и boole ? Мое “не программистское” мышление не может понять логики в цитатах из хелпа по этим ф-иям.
__________________
Блог |
||||
![]() |
|
||||
Инженер-теплотехник Регистрация: 17.08.2006
Смоленск
Сообщений: 308
|
Да, действительно, при выключении привязок прибавляется 16384. Был не прав, извиняюсь.
>> andery. Вот об этом и говорил: внимательнее к цифрам. Ноль тоже меньше 16384, в системе этого значения нет, но его можно выставить вручную. Получается, когда osmode=0 или >= 16384 привязки выключены, от 1 до 16383 - включены. Добавлю еще. Когда все привязки выключены вручную (Drafting settings -> Object Snap) то osmode=0 а не 16384. Именно это число (16384) нигде не показывается, оно служит лишь добавкой. Последний раз редактировалось Олег К., 29.07.2008 в 16:57. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
2. Вкратце каждое число представляется в двоичной системе счисления и сравнивается каждый бит. В общем забудь. Понятней с if - используй его.
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 30.07.2008 в 12:48. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Цвет слоя - красный. Тип линии - Continuous. После завершения команды AutoCAD должен вернуться на начальный слой.
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 29.07.2008 в 17:05. Причина: Уточнение задания |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Тип линии - Continuous. После завершения команды AutoCAD должен вернуться на начальный слой.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
VVA, Кулик Алексей aka kpblc,
А функции подсказать? Через command вроде как не пройдет. Цитата:
Цитата:
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Red Nova, Пишет правильно
Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
andery, Ничего не делать. Оставить как есть.
Цитата:
Команда _-LAYER, переменная CLAYER
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Понял.
![]()
__________________
Блог |
||||
![]() |
|
||||
VVA,
Вот вариант команды одновременно и отключающей и включающей привязки. Работает. Код:
__________________
Блог |
||||
![]() |
|
||||
Из хелпа
Цитата:
(0 . "CIRCLE") тут 0 Значит, что создается объект, далее поясняется, что это круг. (8 . "MYLAYER") тут 8 означает, что создается слой, далее его имя. (10 5.0 7.0 0.0) 10 означает что далее идут координаты центра объекта. (40 . 1.0) 40 означает, что далее идет радиус объекта. Если я прав, то где найти коды для других операций?
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
DXF Reference. По ходу дела разберись с разницей между ', list, cond.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер-теплотехник Регистрация: 17.08.2006
Смоленск
Сообщений: 308
|
А не рано? VVA хотел, чтоб пока командами научились работать.
dxf-коды можно посмотреть в хелпе редактора лиспа, раздел "DXF Reference". Не создается, а "это объект такой-то" и "находится на слое таком-то". Если в создаваемом объекте указан отсутствующий слой, то он (слой) будет создан, но с умолчальными настройками. |
|||
![]() |
|
||||
Регистрация: 11.10.2004
e•burg
Сообщений: 755
|
Цитата:
Код:
|
|||
![]() |
|
||||
Олег К.,
А как командами это сделат? Хоть намекни что надо использовать.
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
![]() #235 для кого писалось?
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Инженер-теплотехник Регистрация: 17.08.2006
Смоленск
Сообщений: 308
|
Цитата:
Вас тут двое обучающихся, но даже если сообщение адресуется одному, другому тоже рекомендуется читать. |
|||
![]() |
|
||||
VVA,
Цитата:
![]()
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
andery, В общем хорошо кроме одного: если при запросе угла поворота нажать ESC, то не восстановится ни слой, ни osnapcoord
Прочитай пост #192 , пример #194 и 196. Хочу чтобы кодга нажму ESC все осталось как было. *** Добавлено Еще хочу чтобы круг был синим. См. команды _CHANGE и _CHPROP
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 30.07.2008 в 17:25. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
andery, Зачтено.
Теперь синим пусть будут и полилиния и круг. Будем учиться работать с наборами. Наборы - это коробочка с именами примитивов (типа entlast), которую тоже можно указывать в ответ на запрос "Выберите объекты". Туда можно по мере отрисовки примитивов их складывать, чтобы скормить какой-либо команде за один раз. В общем с наборами работают следующие ф-ции лиспа: ssadd , ssdel ,sslength, ssname Нам здесь понадобится ssadd Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Пока я справлял день рождения вы ушли вперед. Будем догонять.
__________________
Блог |
||||
![]() |
|
||||
VVA,
Вот код по заданию с #230 Код:
__________________
Блог |
||||
![]() |
|
||||
Догоняю дальше. Вот с заданием кругу синего цвета.
Код:
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
До undo еще дойдем. В этой строке (пост #257)
Код:
И еще: 1. Опция _make команды _-LAYER создает слой и делает его текущим. Позтому _set можно не применять 2. Тип линии слою мы не задаем. Тогда зачем вызывать опцию ltype да еще с нарушением п.2 правил
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Регистрация: 27.12.2007
Сообщений: 132
![]() |
Цитата:
.... Можна усложнять дальше... |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
![]() |
|||
![]() |
|
||||
VVA
Цитата:
Цитата:
__________________
Блог |
||||
![]() |
|
||||
ShaggyDoc,
К примеру с bool мне точно самому не разобраться.
__________________
Блог Последний раз редактировалось Red Nova, 31.07.2008 в 11:36. |
||||
![]() |
|
||||
VVA,
Вот вариант с ssadd Код:
![]()
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Цитата:
Задание: 1.Колонну (круг исключаем) создадим ввиде блока и вставлять будем блоком. 2.Блок Колонна будет размером 1x1, при вставке длину и ширину будем задавать ввиде масштабных коэффициентов по X и Y. 3. Все элементы блока создаются цветом, типом, весом линии "ПОБЛОКУ" на слое "0" 4. Сам блок вставляется на слой "Колонна" Алгоритм 1. Проверить существование блока "Колонна" (функия tblsearch таблица "BLOCK", Перечень всех таблиц см. tblnext) 2. Если блока нет, то отрисовать блок в точке 0,0 с учетом п.2 и п.3 и создать определение блока (команда _-BLOCK 3. Запросить длину и ширину колонны 4. Создать слой "Колонна" 5. Вставить блок Колонна с маштабами X=Длина Y=Ширина. Запросить точку и угол поворота у пользователя. (Команда _-INSERT) Обращаю внимание: Точку вставки запрашиваем не getpoint, а командой _insert. При этом блок с указанными размерами должен "висеть" на курсоре и ждать своей дальнейшей участи. 6. Восстановить все по как было
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 31.07.2008 в 16:43. |
|||
![]() |
|
||||
VVA,
Я правильно понял, это уже DXF Reference?
__________________
Блог |
||||
![]() |
|
||||
Пока понял только что можно искать так
Код:
Как на if повесить возвращенный nil не знаю. И что вернет если не nil. Из хелпа Цитата:
![]()
__________________
Блог |
||||
![]() |
|
||||
Регистрация: 11.10.2004
e•burg
Сообщений: 755
|
Полагаю, что пока задача оперирования DXF не ставилась - по крайней мере, описанное задание вполне решается в рамках командного стиля.
Цитата:
Код:
Если tblsearch возвращает не nil, то как раз это и есть DXF описание искомого объекта. Правда описание неполное и пригодное не для всего, но в данном случае это не существенно. |
|||
![]() |
|
||||
Alaspher, Спасибо.
Застрял на задании типа линии по блоку. В диалоге -layer не принимает ввод byblock.
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Создать слой с типом линии "ByBlock" или "ByLayer" можно (чисто программно), но устойчивость AutoCAD'a в таком случае оставляет желать лучшего
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Как же быть тогда с заданием от VVA?
Цитата:
__________________
Блог |
||||
![]() |
|
||||
Ну тогда так. (может и не совсем в том порядке, что просил VVA, но работает)
![]() Код:
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
А еще лучше воспользоваться системными переменными clayer, celtype, cecolor...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Кулик Алексей aka kpblc,
А как тогда быть с lweight?
__________________
Блог |
||||
![]() |
|
||||
Alaspher,
Цитата:
Цитата:
__________________
Блог |
||||
![]() |
|
|||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Нет. В DXF ме не лезем. Все это можно сделать командами.
Цитата:
Цитата:
Цитата:
Цитата:
Код:
__________________
Как использовать код на Лиспе читаем здесь |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Red Nova, Твоя команда нарушает п.5 задания. Я даже специяльно обратил на это внимание.
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
|||||
VVA,
Цитата:
Цитата:
Цитата:
__________________
Блог |
|||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
(подсказа: команда _-INSERT опции _X и _Y)
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Вот что-то подобное. Смущает то, что блок сперва в исходном масштабе висит на курсоре, и только в конце принимает нужный масштаб. А еще не знаю как сюда впихнуть координату вставки по умолчанию 0.0.
Код:
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Red Nova,
Цитата:
*** Добавлено И логика хромает. Получается если блока нет, то он создается. Но чтобы его вставить нужно повторно выполнить команду. Нужно так Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
VVA,
На сколько я понял у -insert есть определенная последовательность. Сначала запрашивается имя блока, после его ввода блок и до указания мышкой точки вставки блок будет висеть на курсоре в исходном масштабе, потом уже запрашиваются параметры X и Y. Может можно сделать так, чтобы параметры X и Y запрашивались до вставки блока?
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
![]() В командной строке введи _-insert, затем 1 (имя блока) и не указывая точку вставки введи _X, затем 2 и посмотри что будет висеть на курсоре. А так же там есть опции _PX, _PY
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Тогда так
Код:
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Прочитай ***Добавлено в # 284 + ты не закончил команду _-INSERT: у тебя пауза на точку вставки, а там есть еще запрос угла поворота
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
VVA,
Цитата:
Цитата:
Код:
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Восстанавливаем круг. После вставки блока "Колонна" нужно отрисовать круг с цетром в точке вставки колонны и радиусом = размер по X (Подстазка - переменная LASTPOINT)
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
VVA,
Цитата:
Код:
__________________
Блог |
||||
![]() |
|
||||
Я и не знал про not
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Стандартная функция "отрицания"
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Red Nova В #284 Когда писал это
Цитата:
БЛОКА НЕТ? = (not (tblsearch "block" "Колонна")) В остальном гораздо лучше чем в начале темы, но
Когда я начинал изучать Лисп (это был или 1991 или 1992 год) то интернета не было, но у нас был официально куплен Автокад R10, был справочник по AutoLISP и никто его не знал . Я ставил перед собой маленькую задачу типа: "Нужно запросить у пользователя точку", брал справочник и читая описание каждой ф-ции искал подходящую, найдя - пробывал. Это я про Цитата:
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 01.08.2008 в 11:24. |
|||
![]() |
|
||||
VVA,
Тогда так Код:
__________________
Блог |
||||
![]() |
|
||||
Хочу новое задание
![]()
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Ну тогда так:
Хочу задать длину и ширину и вставлять колонны-БЛОКИ пока не посинею или мышь не задымится
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
А подсказки не будет?
![]()
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Еще задача - подсчитать количество колонн, с сортировкой по габаритам. Типа "400х600 - 20 шт; 200х800 - 1 шт."
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Общее для всех методов:
Сначала блок _insert'ом вставляем в укромное место, а затем из этого укромного места что-то с ним делаем По возрастанию предпочтения и сложности 1.вставить блок в точку 0,0 и вызвать copy, затем блок в точке 0,0 удалить (предварительно запомнив) 2.Вставить блок в 0,0. Copyclip, удалить блок и в цикле pasteclip. 3. В цикле Вставить блок в 0,0. И использовать _CHANGE режим точка изменения (Пояснение Команда _CHANGE (режим точка изменения. Т.е. _change выбрать блок на запрос "очка изменения или [Свойства]" нажать enter и посмотреть на запросы дальше ) Общее для всех вариантов условие выхода из цикла: не изменилась LASTPOINT (пользователь не указал точку, а нажал ввод) *** Добавлено Здесь можно посмотреть пример http://dwg.ru/f/showpost.php?p=91119&postcount=41
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 01.08.2008 в 22:24. |
|||
![]() |
|
||||
VVA,
Хотел пойти по третьему пути. Понял что нужно использовать while, а внутрь его всунуть if, но как получить nil в результате ввода enter ?
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Посмотри как это сделано во 2-м лиспе по ссылке с поста #301
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
VVA, Попытался понять твой лисп #301. По возможности изучил новые функции оттуда. Не совсем все понял, но вроде как надумал один вариант на основе твоего.
Принцип такой. Создаю цикл при помощи while. В нем вставляется колонна (в 0.0), затем применяется change, запоминаются точка 0.0 и вставленный последним блок. Затем lastpoint присваивается новой переменной, и мы начинаем вставлять блок в разные точки. функцией If проверяем равенство двух переменных отвечающих за последнюю и первую точку вставки, как только нажимаем энтер, то блок вставляется в начальную точку, и две переменные уравниваются. Как только ловится это условие, то последний блок удаляется, цикл прекращается. Написать это так чтобы заработало само собой не получилось. Да и задумка наверное не верная. Вот код. Код:
Почему в цикле while только princ? Зачем тебе в If вторая часть? Цитата:
Почему не сравнить последнюю точку "LASTPOINT" с точкой 0,0? Зачем при этом две переменные, ведь можно и одной. Типа повторяем цикл, как только переменная с "LASTPOINT" попадает в 0,0, то цикл завершен.
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Задумка верная. Только
Код:
Цитата:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
VVA, Пока не заработало.
Код:
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Вот интересно, если код пишется для AutoCAD'a, то почему не использовать vl-cmdf и его особенности?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Кулик Алексей aka kpblc,
Дай подсказку к своему заданию по поводу подсчета блоков пожалста.
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Получаешь набор блоков (с фильтрацией по имени), проход по каждому элементу. Забрать "габариты"; если "габариты" уже есть в списке результатов, то для этого элемента увеличить счетчик.
Понадобятся функции ssget, ssname, assoc, member, subst, cons.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Код:
Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
VVA,
Поправил, теперь работает. ![]() Код:
__________________
Блог |
||||
![]() |
|
||||
Кулик Алексей aka kpblc,
Вроде можно выбрать все блоки “колонна” вот так Код:
Выбрать очередной элемент можно так (загнав в цикл) Код:
Код:
Зачем нужны member, subst, cons пока не понял
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Примерно так (код не гонял и не проверял совсем):
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Кулик Алексей aka kpblc,
Их хелпа Цитата:
item = <имя>, (_dwgru-conv-pickset-to-list selset) = <список> (if (member ...............)) = <выражение> Что такое (_dwgru-conv-pickset-to-list selset)? Если это функция разработанная на этом сайте, то почему ее нет в коде? Про остальное пока молчу. Непонятного много пока. VVA Жду еще задания ![]()
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
В подписи см. библиотека DwgRuLispLib.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
kpblc,
Нашел по поиску только в этом топике, на #21. В библиотеке нету.
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Кулик Алексей aka kpblc, ]
Пытаюсь понять структуру функции (_dwgru-conv-pickset-to-list selset). Начал с самой внутренней строчки. Там такое Код:
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Запусти в VLIDE следующие строки:
Код:
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
"1-" или "1+" это тоже имена функций. Странные такие, но все равно имена. Этим функциям передается аргументом целое число, результат (сам догадайся). |
|||
![]() |
|
||||
Регистрация: 11.10.2004
e•burg
Сообщений: 755
|
С учётом контекста (AutoLISP) "любое число" тождественно "любому вещественному числу", а точнее - "любому рациональному числу" (и то с некоторыми ограничениями), поскольку сам язык не позволяет выйти за эти рамки. В хэлпе дано в варианте "Any number", что подразумевает любое число допустимое в AutoLISP.
|
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
И вообще фулдить на уроках...
![]() P.S. не удержался - (1+ (sqrt 2)) - работает, а значит и ирациональному.
__________________
Когда в руках молоток все вокруг кажется гвоздями. Последний раз редактировалось Дима_, 05.08.2008 в 14:11. |
|||
![]() |
|
||||
Тогда еще вопрос. Как понять это
Код:
__________________
Блог |
||||
![]() |
|
||||
Регистрация: 11.10.2004
e•burg
Сообщений: 755
|
Цитата:
![]() В выражении [FONT=Courier New](1+ (sqrt 2))[/FONT] на вход функции [FONT=Courier New]1+[/FONT] будет подан результат выполнения функции [FONT=Courier New]sqrt[/FONT] фиксированной точности, т.е. рациональное число, где вся "иррациональность" будет уже потеряна - [FONT=Courier New]1+[/FONT] ничего "не знает" об источнике своего аргумента, если так можно выразиться. Последний раз редактировалось Alaspher, 05.08.2008 в 14:48. |
|||
![]() |
|
||||
Регистрация: 11.10.2004
e•burg
Сообщений: 755
|
|
|||
![]() |
|
||||
А как понять это
Код:
Цитата:
repeat <число> <выражение> А у нас вместо <числа> (setq tab nil item (sslength value)) Как ни кручу это выражение не может вернуть число.
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Код:
P.S. Непонятные куски запускай в консоли vlide - понимания будет больше )
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Цитата:
1. (* (1- (1+ (sqrt 2))) (1+ (1- (sqrt 2)))) 2.0; 2. (* 100000000000000000000 (/ 10 3.0)) 3.33333e+020; 3. (* 6.0 (/ 20.0 3.0)) 40.0; - по Вашей логике (если числа выдаються с определенной точностью) ответы должны другими получаться.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Регистрация: 11.10.2004
e•burg
Сообщений: 755
|
Не обязательно - если сохранять все промежуточные результаты в переменных, то окончательный результат не изменится, т.е. в данных случаях просто округление происходит в "правильную" сторону.
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
1. (1- (1+ (sqrt 2))) -> (sqrt 2)
(1+ (1- (sqrt 2))) -> (sqrt 2) (* (sqrt 2) (sqrt 2)) -> 2.0 Так что все логично 2. (/ 10 3.0) -> 10/3 (* 1e20 10/3) да простят меня профессионалы -> (/ 1e21 3.) -> воспользуюсь математической записью 3.(3) * 10^20: 3.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
kpblc, Вот что отвечает Vlide
Цитата:
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
А перед этим сделать (setq value (ssget)) попробуй
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
У меня проблема с пониманием смысла value в данном коде, да и вообще с пониманием понятия аргумент.
Смысл переменной был понятен сразу. Ей можно присваивать разные значения. А какую роль играют аргументы не пойму. Вот к примеру тут Код:
Код:
Извиняюсь за черепашье мышление.
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
В данном случае value не "любое", а именно pickset - то есть результат (ssget). При вызове, аналогичном
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Как вариант - а есть идеи как можно проверить каким способом он работает? (то есть проверить хранит он в переменнной число с определенной точностью а при значениях близких к "круглым" - округляет или-же иррациональное выражение).
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
То есть получается, что вызывая
Код:
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Ну типа того (если я только не запутался окончательно)
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Получается мы записываем в список tab имена всех элементов списка selset. А что возвращает функция (_dwgru-conv-pickset-to-list selset)? Полученный список tab?
__________________
Блог |
||||
![]() |
|
||||
То есть смысл (_dwgru-conv-pickset-to-list selset) в данном коде это преобразование набора в список имен элементов в него входящих?
__________________
Блог |
||||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
![]() А разобраться по исходнику бывает очень трудно, особенно если текст лихо оптимизирован в "лисповском" стиле. Иногда даже приходится, в сложных случаях, "деоптимизировать" текст. Поначалу можно писать и "по-бейсиковски", то есть присваивать через setq значения переменным, а потом уже что-то делать. Типа Код:
Код:
Код:
|
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
У меня есть предложение ко всем, но в основном модераторам такого плана:
Разделить уроки на "академисеские часы" или даже на мастер-классы, а не валить все в одну кучу. Этот топик (удалив все лишнее) можно например назвать "Урок 1. Создание и модификация примитивов с помощью команд Автокада" Задание Алексея вынести в "Урок 2. Модификация и создание примитивов с помощью enget, entmake и т.д." ну и т.д. Потом урок 3 и т.д.
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
VVA, Я буду только за. Мне бы уроков по больше и по понятнее
![]() Но в этом случае правильно будет создать новый подраздел в разделе программирование, и назвать его типа "Уроки программирования" и там уже создать отдельные топики уроков по разной тематике. P.S. В свое время обнаружив этот сайт я был удивлен отсутствием на нем разделов с уроками, на сайтах по 3dmax таких уроков пруд пруди.
__________________
Блог Последний раз редактировалось Red Nova, 05.08.2008 в 22:00. |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
(ssget)
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Пока модераторы думают над мыслю VVA я продолжу разборку кода с поста #314 от kpblc. Приведу его снова
Код:
Как понять (entget item) Item в числе локальных переменных функции test нет, но есть среди локальных переменных функции _dwgru-conv-pickset-to-list. Насколько я знаю локальная переменная живет на срок действия ее функции. То есть на момент ее упоминания она уже не локальная переменная. Из хелпа Цитата:
__________________
Блог |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
ename это имя примитива возращаемого функциями entlast, entsel, ssname.
Если не понятно то нарисуй круг и введи (entget (entlast)). P.S. Гуру, не издевайтесь, скорей объясняйте DXF.
__________________
Когда в руках молоток все вокруг кажется гвоздями. Последний раз редактировалось Дима_, 06.08.2008 в 16:09. |
|||
![]() |
|
||||
Дима_, Не не пойму. Ты на конкретном примере объясни, на посте #346, что делает (entget item)
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Нет, и проблема не в (ssget)
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер-строитель Регистрация: 15.08.2007
Киров
Сообщений: 2,204
|
Цитата:
Добавлено: Вот, накатал простенький лиспик для демонстрации вышенаписанного: Код:
|
|||
![]() |
|
||||
На вопрос ты все же не ответил. Надо понять что (entget item) означает в данном коде.
__________________
Блог |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
команда (foreach item... )создает временную переменнту item, которая действует ТОЛЬКО внутри цикла foreach и принимает последовательно (циклично) все значения списка вернувшего (_dwgru-conv-pickset-to-list selset), далее в этом-же цикле есть команда (entget item) - возращает свойства примитива в виде списка состоящего из DXF кодов (ты уже использовал их в (ssget '((0 . "INSERT") (2 . "Колонна"))))), а команда (cdr(assoc xx возращает первое значение из списка с кодом хх - расшифровка кодов в DXF Reference
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Спасибо. Эту часть понял
Код:
Код:
Цитата:
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Масштаб_блока_XxМасштаб_блока_Y (например "400x300") Она же и является ключом поиска в списке res для ф-ций member и assoc. В res ввиде ассоциативного списка будем подсчитывать размеры колонн Добустим у нас 2 колонны размером 300x400 и 1 400x400. ТОгда окончательное значение res='(("300x400" . 2)("400x400" . 1)) (mapcar 'car res)= выполняет ф-цию car ко всем элементам res. Т.е. (car '("300x400" . 2)) и (car '("400x400" . 1)). В итоге получается список из 1-х элементов res (ключей) res='(("300x400" . 2)("400x400" . 1)) (mapcar 'car res) = '("300x400" "400x400")
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
VVA,
Про (Масштаб_блока_XxМасштаб_блока_Y) понял. А про ключ поиска не понял. Что это такое? Цитата:
Из хелпа Цитата:
Не могу понять каким образом res получает связь с размерами колонн.
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Примерно так получилось (см.комментарии)
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Кулик Алексей aka kpblc,
Все равно вопрос с #354 остается мною непонятым ![]()
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
res - не ключ. Это результирующий список.
Иллюстрации для member: Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Твой код с #357 я полностью понимаю. Как работают mapcar и member мне ясно. Непонятно как переменная res принимает на сея значение выражения
Код:
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Стоп. Попробую словами, без кодов. Правда, подробно, боюсь, не получится.
"Зайдем" в цикл. item - элемент набора. Из этого элемента забираем коэффициент масштабирования по осям х и у (соответственно группы 41 и 42) и из них формируем текстовую строку "<Ширина>х<Высота>". Чтобы не вычислять ее еще несколько раз, засовываем в переменную size (в #355 помечено как {1} - это база, с нее начинаются все пляски). Ну а дальше я в 355 вроде расписал.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
То что ты написал я как раз знаю. Я именно это и говорю. Ты записал "<Ширина>х<Высота>" в переменную size. Но далее, в mapcar, ты используешь не size а res
![]() Код:
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
(mapcar 'car nil) вернет nil, соответственно (member <Чего-то-там> nil) вернет тоже nil. И будет выполняться строка
Код:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 27.12.2007
Сообщений: 132
![]() |
Цитата:
Обращение к ГУРу: я понимаю что для Вас это все понятно и возможно уже неинтересно, но мне (нам) начинающим сложно шагать такими шагами. Чуть помедленнее. Расписать ВСЕ возможности функций, их вариации.... Но эт так, может я торможу.... ИМХО считать кол-во заданых колон немного рановато.... А то выполняем сложные задачи, а не знали что монжна одним setq присваивать несколько значений, или пользовать if (progn), ну и всякое такое.... Вопрос такой чуть не по теме: хочу создать свой стиль текста с помощью команды _-style (command "_-style" "gost200" "ISOCPEUR" 200 "1" "0" "_n" "_n") Вопрос: как сделать курсив? Неужели углом наклона? Я хочу оригинальный курсив данного шрифта. Спаибо. Последний раз редактировалось andery, 08.08.2008 в 18:01. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Кхе, одним setq можно не только несколько значений присваивать. В результате выполнения кода
Код:
Код:
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 27.12.2007
Сообщений: 132
![]() |
Повторю вопрос, может кто знает....
хочу создать свой стиль текста с помощью команды _-style (command "_-style" "gost200" "ISOCPEUR" 200 "1" "0" "_n" "_n") Вопрос: как сделать курсив? Неужели углом наклона? Я хочу оригинальный курсив данного шрифта. Заранее благодарен. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 27.12.2007
Сообщений: 132
![]() |
Цитата:
![]() Я хочу просто курсив.... ![]() Последний раз редактировалось andery, 12.08.2008 в 22:53. |
|||
![]() |
|
||||
Регистрация: 27.12.2007
Сообщений: 132
![]() |
Цитата:
Не получится с помощью данной команды? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Под словом "угол" подразумевается угол наклона букв.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 27.12.2007
Сообщений: 132
![]() |
Спасибо, это я понимаю.
Хочу задать опцию "начертание" с командной строки. Последний раз редактировалось Кулик Алексей aka kpblc, 14.08.2008 в 16:08. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
При использовании shx-шрифтов, по-моему, такого нет. ttf-шрифтами просто не пользуюсь - весу и головняка много, а толку - "маловато будет" (с)
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
shx-шрифты, насколько я помню, можно редактировать. Подробностей не знаю
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Отбился я от рук. Работа...
kpblc, Твой лисп я таки понял, но как синхронизировать его с "колонной". Я топорно вставил, и пока не работает. Код:
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
А в каком именно месте не работает? по-моему (код не тестировал - не до того
![]() ![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
А я не знаю как.
__________________
Блог |
||||
![]() |
|
||||
kpblc
Знаю что нужно использовать prompt, но правильно записать (и где) понять не могу. ![]()
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
можно, конечно, и prompt. Но я б использовал princ.
Извини, у меня сейчас запарка, я отвечать осмысленно врд ли смогу
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Пдаждемс
__________________
Блог |
||||
![]() |
|
||||
Регистрация: 27.12.2007
Сообщений: 132
![]() |
Решил для себя написать такой лисп.
Данный листп создает стили шрифтов (шрифт ISOCPEUR и его курсив) от вводимого минимального размера до максимального с заданным интервалом. Код:
Но itoa понимает тока целые числа, может есть какой то выход ? или надо игратся с переносом нуля, отделением цело или десятичной части ..... |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Практически аналог (command). Единственное отличие в AutoCAD - при успешном завершении возвращает t (command возвращает nil независимо ни от чего).
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.10.2004
e•burg
Сообщений: 755
|
Есть ещё одно важное отличие - vl-cmdf вычисляет аргумент перед передачей и если возникает ошибка, то аргумент не передаётся (соответственно не возникает ошибка команды, которую ЛИСП обработать уже не может), а command валит аргументы в комстроку не глядя.
|
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
vl - visual lisp, а переходить к ним надо когда не хочешь изобретать велосипед, например если надо объем померить, или таблицу заполнить - можно и через dxf, но муторно да и незачем.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
CAD Регистрация: 28.08.2003
Киев
Сообщений: 1,834
![]() |
Цитата:
Зайдите к Поспелову http://cadhlp.kulichki.com/pgtxt.htm возьмите russ-pg.shx и будет Вам счастье.
__________________
По теории майский жук летать не может. Но он этого не знает. И летает... |
|||
![]() |
|
||||
Предлагаю возобновить обучение чайников.
Мне хотелось бы научиться работать со списками. По соседству я начал тему про копирование данных из выносок СПДС в спецификацию из мтекстов. Крыс написал функцию преобразующую содержание позиционных выносок в набор. Теперь следующим шагом должна быть фильтрация ненужной информации и модификация списка. Чему собственно и хотелось бы научиться. Предположим имеем такой список: (("1" "Тр. Ø89х3.5, L=2500") ("Труба" "") ("2" "-10х100x100") ("3" "Уголок 75х5, L=800") ("4" "Швеллер 20") ("" "Швеллер") ("Труба" "бесшовная") ("2 окна" "класса а") ("5" "Проем") ("6" "Стекловата")) Со списком нужно произвести ряд операций. В первую очередь нужно отфильтровать ненужные элементы списка. Элементы которые нужно оставить должны удовлетворять следующим пунктам. 1. Данные должны содержать оба элемента пары. То есть элементы ("Труба" "") и ("" "Швеллер") нужно удалить из списка, так как они не удовлетворяют указанному условию. 2. Верхняя строка выноски (первый элемент пары) должна содержать информацию нумерационного характера, нумерация отсчитывается по цифрам и по буквам латинского и русского алфавитов. Можно использовать знак ‘ и “. Допускаемые записи могут иметь такой вид – 1, 2, 3, 4, // а, б, в, г, // a, b, c, d, // 1a, 1b, 1c, // 1, 1’, 1”, 2, 2’ // a1, a2, a3, b, b1, ... То есть на данном этапе отсеваются элементы ("Труба" "бесшовная") ("2 окна" "класса а")) 3. Нижняя строка должна начинаться на определенные символы, вот их список - Знак “-”, слова “Лист” и “Полоса” - Слово “Труба”, “Тр.” и знак трубы из шрифтов СПДС - Слово “Уголок” и аналогичные символы из шрифтов СПДС - Слово “Двутавр” и аналогичные символы из шрифтов СПДС - Слово “Швеллер” и аналогичные символы из шрифтов СПДС - Слово “Фланец”, то же “Фл.” - Стандартный знак диаметра и знак диаметра из шрифтов СПДС - Символ квадратной трубы из шрифтов СПДС То есть на данном этапе отсеваются элементы ("5" "Проем") ("6" "Стекловата")) В результате остается список из элементов (("1" "Тр. Ø89х3.5, L=2500") ("2" "-10х100x100") ("3" "Уголок 75х5, L=800") ("4" "Швеллер 20")) Ясно что тут пригодятся car и cdr. Но как пройтись по всему списку и самое главное как правильно задать фильтр я не знаю. Был бы благодарен если кто-нибудь напишет хоть один пример фильтрации из вышеприведенного списка, тогда я пойду по подобию, может даже удачно.
__________________
Блог |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
А в чем сложность то? Напиши функцию которая распознает элемент по заданным критериям (parsing) и
(foreach tmp lst (if (parsing tmp) (setq newlst (append newlst tmp))) ) П.С. написанно без проверки, но суть я думаю ясна
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Уж лучше тогда использовать (vl-remove-if) или (vl-remove-if-not) ...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Дима_,
Цитата:
kpblc Если можно, то хотелось бы без vla обойтись.
__________________
Блог |
||||
![]() |
|
||||
Дима_
Попробую разобраться. (append newlst tmp) Из хелпа Цитата:
(setq newlst (append newlst tmp)) Назначаем newlst только что полученный склеенный список. (if (parsing tmp) (setq newlst (append newlst tmp))) Не пойму что значит (parsing tmp). Из хелпа Цитата:
![]()
__________________
Блог |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Короче подразумеваеться функция которая проверят все вышеперечисленные условия к параметру и в зависимости от результат возращает T или nil, ну а дальше применяешь ее к всему списку либо как я написал - либо по КРЫС'овски.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Дима_
Можно полный пример, я так не пойму? Принцип ясен, а с исполнение туманно. Вот функция от крыса, которая преобразует выноски в список. Прицепи к ней пожалуйста какой–нибудь фильтр из мною упомянутых. Код:
__________________
Блог |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Код:
(list lst) (filtr lst) (vfiltr lst) обращаю внимание что функции НЕ ИЗМЕНЯЮТ списки а возращают отфильтрованные, то есть для замены понадобиться: (setq lst (filtr lst))
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Дима_
Вроде как начал понимать. ![]() Функция (setq lst (filtr lst)) будет применять к каждому парному элементу списка lst фильтр parsing, который проверяет удовлетворяет ли пара различным условием. Соединив твой лисп с Лиспом от крыса получил вот что. (Проверил, работает) Код:
Подскажи пожалуйста как быть со вторым и третьим пунктами? Цитата:
__________________
Блог Последний раз редактировалось Red Nova, 25.09.2008 в 12:30. |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Значит так. Ставишь выноски со своими текстами (всеми, которые надо использовать в дальнейшем), получаешь с нее строки и результат на форум (код используй в #404. Хотя номер поста, конечно, вгоняет в дрожь
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
kpblc
Я так понял, что ты хочешь чтобы я привел пример списка, который надо фильтровать. Если так то вот. Но я использую лисп не с #404 а с # 408, там уже отфильтрованы выноски одна из строк которых не содержит информацию. (("1" "Дверь") ("1" "-10х100x100") ("1\"" "-10х100x250") ("1'" "-10х100x200") ("10" "2x40x40, L=1000") ("11" "2x40x40, ΣL=10000") ("12" "Тр. 89х3.5") ("13" "75х5") ("14" "Уголок 75х5") ("15" "20") ("16" "Двутавр 20") ("17" "12") ("18" "Швеллер 12") ("19" "12 Ас1, ΣL=10000") ("1a" "-10х100x600") ("1АС" "Швеллер") ("2" "Окно") ("2" "Лист -10х100x100") ("20" "20 А500c") ("21" "8 20 А500c") ("3" "Фл. 300х8") ("4" "Фланец 300х8") ("5" "Лист ромб -10х100x300") ("6" "Лист чечевица -10х100x300") ("7" "-4х50, L=1000") ("8" "Полоса -4х50, L=1000") ("9" "Полоса -4х50, ΣL=10000") ("a" "-10х100x500") ("a1" "-10х100x300") ("a2" "-10х100x400") ("АС" "Двутавр") ("Торец" "фрезеровать")) Здесь на месте крякозябр спец. символы СПДС для профилей, на всякий случай выкладываю и корректный список в формате dwg (без крякозябр). Думаю шрифты СПДС в наличие у формумчан есть. В прикрепленном файле есть также пояснение что надо удалить, а что оставить. Цитата:
![]()
__________________
Блог |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
С 3 условием все просто составляешь список (spisok) возможных начал и
Код:
(check3 (cadr tmp) spisok) Со вторым пунктом распиши условия поясней, чего можно чего нельзя. P.S. Вобще алгоритм проверки не очень правильный, т.к. проверяет весь spisok, а достаточно до совпадения, то есть что то типа (while (and ..., но чтоб тебя не путать оставил проверку всего списка.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Дима_
Не понял что ты имел в виду говоря Цитата:
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
> #410: Лови:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
kpblc, Спсибо, но пока удаляет и то что не надо удалять, вот что осталось
(("21" "8 20 А500c") ("20" "20 А500c") ("19" "12 Ас1, ΣL=10000") ("17" "12") ("15" "20") ("12" "Тр. 89х3.5") ("11" "2x40x40, ΣL=10000") ("10" "2x40x40, L=1000") ("4" "Фланец 300х8") ("3" "Фл. 300х8"))
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Тогда надо образец. Я проверял на 12 выносках, работало вроде корректно...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Пытался сделать как Дима_ говорит, лисп перестал работать.
Что я сделал не так? (последние изменения отмечены красным) Код:
__________________
Блог Последний раз редактировалось Red Nova, 27.09.2008 в 13:01. |
||||
![]() |
|
||||
kpblc,
Вот образец
__________________
Блог |
||||
![]() |
|
||||
Дима_
Попробую еще раз объяснить про пункт 2, Верхняя строка выноски должна содержать номер позиции, говоря номер подразумеваем цифру, букву (одну), цифру + букву. То есть номера могут быть такие. 1, 2, 3, 4, 5, 6, 7, 8, 9 a, b, c, d, e, f, g а, б, в, г, д, е 1a, 1b, 1c, 1d, 1e, 1f, 1g 1а, 1б, 1в, 1г, 1д, 1е Допускается использовать все вышеупомянутое вместе со знаками ‘ и “ Не допускается чтобы в номере одновременно были две буквы. То есть строки “1ас” “ad5” не подходят.
__________________
Блог |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Цитата:
P.S. Вобще у тебя все функции объявляються внутри функции тест - не правильно это - не должно быть вложенных defun'ов: то есть не (defun f1... (defun f2...) ) а последовательно: (defun f1...) (defun f2...)
__________________
Когда в руках молоток все вокруг кажется гвоздями. Последний раз редактировалось Дима_, 25.09.2008 в 22:27. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Кто сказал, что нельзя объявлять вложенные функции? Где это сказано, ткни носом!
Живейший пример - локальное переопределение *error* - как собираешься делать без локальных функций?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Да можно их объявлять - просто по моему Red Nova не очень понимает как defun работает - посмотри на код его последний - про который он спрашивает почему не работает.
Для Red Nova если в ком строке написать (setq test "123") то переменной тест будет присвоенно "123", в случае-же (defun prc () (setq test "345")), переменная не изменится, это произойдет только при вызове функции - (prc). В случае-же вложенных defun при выполнении (defun aaa () (defun bbb () (setq ccc "work"))), после этого вызвать функцию (bbb) не получиться, вначале надо запустить (aaa) - только затем (bbb) будет объявленна, но не выполнена - ссс до сих пор = nil, и только сейчас можно вызвать (bbb) и переменной ссс будет присвоенно значение "work". По этому я и советую вначале отдельно объяви все функции - parsing, check3 и пр., а только затем используй их в (test).
__________________
Когда в руках молоток все вокруг кажется гвоздями. Последний раз редактировалось Дима_, 25.09.2008 в 23:43. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Red Nova, Дима_, простите, мужики, но мне бы со своим кодом разобраться...
Кстати, касательно #417: я в свое время пропустил объявление _dwgru-conv-pickset-to-list в качестве локальной переменной, хотя это и не очень хорошо (это что увидел "сразу").
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Цитата:
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||||||
Дима_,
Цитата:
Цитата:
![]() Цитата:
Цитата:
Цитата:
Цитата:
CB, Спасибо за участие. Начало понял. А вот начиная с этой строчки - нет. Цитата:
__________________
Блог |
||||||||
![]() |
|
||||
Дима_,
А теперь что не так ? Код:
__________________
Блог |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Вобщем вот-так, добавлен check2 - я правда его особо не проверял.
Код:
__________________
Когда в руках молоток все вокруг кажется гвоздями. Последний раз редактировалось Дима_, 28.09.2008 в 00:51. |
|||
![]() |
|
||||
Дима_
Пока не заработало Цитата:
__________________
Блог |
||||
![]() |
|
||||
Конструирование в области нефтеразведки Регистрация: 10.02.2006
Гомель
Сообщений: 321
|
>Red Nova (#426)
Не очень то я умею объяснять, но т.к. тема носит прежде всего обучающий характер все же попытаюсь. Естественно главная в фильтре - это функция wcmatch. Эта функция проверяет структуру текста на соответствие с образцом, который сделан по определенным правилам (каждый символ строки сверяется с образцом). Небольшая информация по символам образца, которые здесь применялись (естественно здесь не все...) 1. * - заменяет ВСЕ символы строки до и после *. Например: (wcmatch "Труба" "Труба") ;T - все символы строки и образца совпадают (wcmatch "Труба" "труба") ;nil - не все символы строки и образца совпадают (wcmatch "Труба" "*") ;T - все символы строки заменяет * (wcmatch "Труба" "Тр*") ;T - первые символы строки и образца совпадают, дальше * заменяет все оставшиеся символы строки (wcmatch "Труба" "*уб*") ;T - первые символы строки до символа "у" заменяет *, все символы после "б" также заменяются * (wcmatch "Труба" "*уа*") ;nil ...(надеюсь все понятно) (wcmatch "Труба" "Т*у*") ;T ...(надеюсь и здесь все понятно) Вернемся к нашему примеру: (or (wcmatch (car x) "*‘") (wcmatch (car x) "*“")) Если ПОСЛЕДНИЙ символ строки равен "‘" или "“" то ИСТИНА. 2. [...] - заменяет один любой символ строки на любой символ в [] Например: (wcmatch "1" "[0123456789]") ;T - символ строки присутствует в образце (wcmatch "a" "[0123456789]") ;nil - символ строки отсутствует в образце (wcmatch "1aа" "[0123456789]*") ;T - первый символ строки присутствует в образце, остальные заменяются * 3. - определяет диапазон однотипных символов. Например: (wcmatch "1" "[0123456789]") и (wcmatch "1" "[0-9]") абсолютно идентичы 4. ? заменяет ровно один символ строки Например: (wcmatch "1aа" "[0-9]??") ;T - заменяет два последних символа строки (они могут быть любыми) (wcmatch "1aа" "?[0-9]?") ;nil - первый символ строки любой, второй отсутствует в образце [0-9], третий любой. (wcmatch "a1а" "?[0-9]?") ;T - первый символ строки любой, второй присутствует в образце [0-9], третий любой. 5. , разделяет несколько образцов Например: (wcmatch "a1а" "[0-9]??,?[0-9]?") ;T - первое условие не выполняется, второе выполняется (wcmatch "1аа" "[0-9]??,?[0-9]?") ;T - первое условие выполняется, второе не выполняется 6. # заменяет одну любую цифру Например: (wcmatch "1аа" "#*") ;T - первый символ строки цифра, все остальные заменяются * (wcmatch "20а" "#*") ;T - первый символ строки цифра, все остальные заменяются * (wcmatch "а1а" "#*") ;nil - первый символ строки НЕ цифра, все остальные заменяются * Вернемся к примеру: "[a-gа-е0-9]?,#[a-gа-е0-9]?,##[a-gа-е0-9]?,#*#[a-gа-е0-9]?" Здесь 4 варианта образцов: Первый вариант для двух знаков строки - первый знак может быть любая цифра, буквы из диапазонов от "a" до "g" (a b c d f g) и от "а" до "е" (а б в г д е). Вторая вроде бы любая, но по условию ф-ции if (см. в конце п.1) это могут быть только знаки "‘" или "“" т.е. (wcmatch "1‘" "[a-gа-е0-9]?") ;T - первый символ строки присутствует в образце [a-gа-е0-9], второй любой (wcmatch "a‘" "[a-gа-е0-9]?") ;T - первый символ строки присутствует в образце [a-gа-е0-9], второй любой (wcmatch "q‘" "[a-gа-е0-9]?") ;nil - первый символ строки отсутствует в образце [a-gа-е0-9], второй любой Т.к. в #426 кое-что в условии поменялось, то можно поменять образец на "[A-Za-zА-Яа-я0-9]?" (wcmatch "q‘" "[A-Za-zА-Яа-я0-9]?");T - первый символ строки присутствует в образце "[A-Za-zА-Яа-я0-9]?", второй любой т.е. первый символ может быть любой цифрой или любой буквой (также и заглавной) Хочу заметить следующее - символы в [] восприннимаются не как управляющие, а как они есть т.е. (wcmatch "10" "[A-Za-zА-Яа-я0-9]?") ;T (wcmatch "10" "[A-Za-zА-Яа-я#]?") ;nil символ # не как управляющий (wcmatch "#1" "[A-Za-zА-Яа-я#]?") ;T символ # не как управляющий Второй вариант (#[A-Za-zА-Яа-я0-9]?) для трех знаков строки - первый знак ЦИФРА, дальше по первому варианту (wcmatch "10‘" "#[A-Za-zА-Яа-я0-9]?") ;T (wcmatch "1b‘" "#[A-Za-zА-Яа-я0-9]?") ;T (wcmatch "1б‘" "#[A-Za-zА-Яа-я0-9]?") ;T (wcmatch "a10‘" "#[A-Za-zА-Яа-я0-9]?") ;nil Третий вариант (##[A-Za-zА-Яа-я0-9]?) для четырех знаков строки - первый и второй знаки ЦИФРА, дальше по первому варианту (wcmatch "10a‘" "##[A-Za-zА-Яа-я0-9]?") ;T (wcmatch "100‘" "##[A-Za-zА-Яа-я0-9]?") ;T (wcmatch "1aa‘" "##[A-Za-zА-Яа-я0-9]?") ;nil (wcmatch "a1a‘" "##[A-Za-zА-Яа-я0-9]?") ;nil Четвертый вариант (#*#[A-Za-zА-Яа-я0-9]?) c "подводным камнем" - для случая > четырех знаков строки первый знак ЦИФРA, дальше ЛЮБЫЕ, третий с конца ЦИФРA, второй с конца ЦИФРA или буква, последний любой (в данном случае "‘" или "“"). (wcmatch "100a‘" "#*#[A-Za-zА-Яа-я0-9]?") ;T (wcmatch "1а0a‘" "#*#[A-Za-zА-Яа-я0-9]?") ;T (не правильно) Чтобы исключить "неправильность" я думаю, что лучше это условие изменить на "###[A-Za-zА-Яа-я0-9]?" (wcmatch "1а0a‘" "###[A-Za-zА-Яа-я0-9]?") ;nil (wcmatch "999a‘" "###[A-Za-zА-Яа-я0-9]?") ;T (wcmatch "9999‘" "###[A-Za-zА-Яа-я0-9]?") ;T Ну а дальше все тоже самое, только для случая, если в конце нет знаков "‘" или "“". Последний раз редактировалось CB, 26.09.2008 в 17:34. |
|||
![]() |
|
||||
CB,
Спасибо за объяснение. Очень подробно и понятно. Есть один вопрос. Так получается что образец wcmatch работает только тогда, когда количество символов совпадает с количественным параметром образца. А что если мы напишем образцы для строк содержащих до 4-х символов, а в строке их пять?
__________________
Блог |
||||
![]() |
|
||||
Файл примера dwg прикреплен на #418
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Попробую разобрать мой код из #414:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Дима_
Укоротил список до минимума, не помогло. Код:
__________________
Блог Последний раз редактировалось Red Nova, 27.09.2008 в 11:16. |
||||
![]() |
|
||||
kpblc, Спасибо за подробности, пока не вникал, но заметил что код как и прежде фильтрует и нужную информацию. Например эту
Код:
__________________
Блог |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
А как ты тогда " в текст втавишь? Интерпритатор воспимет ее как закрывающию.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Чудеса какие-то, проверь filtr на тестовом списке? Если работает, то посмотри в отлдчике что lst до него предствляет, наверняка какая-нибудь глупость типа lst в скобках два раза прописан, если сам ошибку найдешь это гораздо полезней, чем тебе ее покажут.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Дима_
Цитата:
__________________
Блог |
||||
![]() |
|
||||
kpblc, CB
Ребята, протестируйте пожалуйста код с #427, у Димы СПДС нет, а я никак не найду где ошибка. Дима_ Пробовал добавить в filtr по отдельности check2 и check2, не работает ни в какую.
__________________
Блог |
||||
![]() |
|
||||
СВ
Пытался соеденить твой код с кодом #404 от крыса, нечего не вышло. Как это правильно сделать? ![]()
__________________
Блог |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
АААААА! Вдарьте мне кирпичом, исправил в #428 - не ругайтесь строго, не тот элемент выравнивал - не из объекта, а из spisk'а - см. check3. А в тестовых моих они одинаковой длинны были.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Конструирование в области нефтеразведки Регистрация: 10.02.2006
Гомель
Сообщений: 321
|
К сожалению СПДС нет и у меня, но я ориентировался на
Цитата:
Лисп в #2 (по этой же ссылке) создает правильный список или нет? Если да, то тогда нужно нужно ориентироваться именно на этот лисп... |
|||
![]() |
|
||||
Дима_
Заработало!!! Фильтр готов. Спасибо большое. ![]() Теперь у нас уже есть отфильтрованный от мусора список. Я немного изменил список (spisok), и теперь наша функция такова. Код:
1. Теперь о продолжении. На пример, в результате фильтрации мы получили такой список. Код:
Видно, что некоторые элементы дублируются абсолютно идентично. ("1" "-10х100x200") ("1" "-10х100x200) А у некоторых одинаков только номер позиции ("2" "Швеллер 12, L=1000, шаг 1000") ("2" "Швеллер 12, L=1000") ("2" "Швеллер 12") ("5" "8 20 А500c, L=1000") ("5" "8 20 А500c") Для правильной фильтрации дублирующих элементов Необходимо произвести сравнение первых и вторых элементов подсписка. Если оба элемента идентичны, то оставляем только один подсписок. Если идентичны только номера позиций, а содержание разное, то надо оставить на первом этапе более длинный подсписок. Таким образом наш список превратится в Код:
Вот такие подсписки, которые содержат лишнюю информацию. ("2" "Швеллер 12, L=1000, шаг 1000") ("5" "8 20 А500c") B.1 Алгоритм должен отслеживать есть ли во второй строке запятые . Не уверен, но если в русской и английской раскладке запятым соответствуют разные символы, то надо учесть оба. Если в строке больше одной запятой, то надо удалить все что идет после второй (вместе с запятой). B.2 Алгоритм должен также проверить начинается ли вторая строка с “цифра пробел диаметр”, или с “цифра диаметр” где диаметр может писаться двумя кодами. Вот список всех возможных комбинаций: Код:
Список должен после этого стать таким Код:
Топик все же обучающий. И хотя мне подсознательно очень хочется получить готовый лисп, я все же хотел бы и сам что-то сделать. Размышлял как самому написать фильтры условия А и В. Для этого сначала надо понять каков принцип работы check3 Попытаюсь разобраться вот в этом. Код:
(substr var 1 (strlen tmp)) Из справки я знаю что strlen вернет количество символов в списке tmp а substr должен вернуть то что получится если от значения var обрубить все что длиннее чем tmp. А вот чему равно var я не знаю. Прошу объяснить.
__________________
Блог Последний раз редактировалось Red Nova, 29.09.2008 в 21:39. |
||||
![]() |
|
||||
CB,
Ошибка уже нашлась. Теперь все работает. Поскольку со многими вариантами мне не совладать, решил продолжать с алгоритмом от Димы, Если еще не надоело помогать, почитай пожалуйста мой предыдущий пост. Там я описал продолжение, и вопрос про алгоритм Димы.
__________________
Блог |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Ну Семен Семенович:
(check3 (cadr tmp) spisok) .... (defun check3 (var lst / flag) var - это аргумент который передается функции, насчет запятой она в обоих раскладках одинаковая. Пилите Шура (я про варианты а и б), что не будет получаться пиши.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Дима_,
Эх коротковато ты объясняешь. Чайник как я не поймет. ![]() Прошу пошагово объяснить вот это Код:
__________________
Блог |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Вобще если есть желание потренироваться, попробуй сам написать аналогичную функцию, но которая не проверяет весь список (как эта), а заканчивается при первом совпадении - не проверяя список до конца, если сам смогешь ИХМО - будет неплохая практика.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Дима_, простыми вариантами в лиспе такое не реализовывается, по-моему. В лиспе нет ведь принудительного выхода из списка (в отличие от VB(A), C++, C# etc) без выхода из функции. (exit) и (quit), по-моему, здесь не сработают. Единственный вариант - использовать set вместо setq, но и он вряд ли даст ожидаемый эффект.
P.S. мне лениво разбираться с кодом и пытаться выяснить, что передается в качестве параметров вызова check3, но вот 3 варианта кода: Код:
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Код:
Код:
Цитата:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Нда, что-то я про while забыл напрочь ) Вай-вай, виноват по самое не могу!
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
А так хотелось чтоб Red Nova сам что-то изобразил.
P.S. А кстати если вставишь в (parsing) вместо check3 check_vva, у тебя появиться логическая ошибка - работать будет но неправильно - попробуй опредили почему, а если и сам исправишь... P.P.S. Искать естественно внутри check_vva надо.
__________________
Когда в руках молоток все вокруг кажется гвоздями. Последний раз редактировалось Дима_, 28.09.2008 в 23:34. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Пока Red Nova занят домашними заданиями, немного модифицированные ф-ции
Код:
Код:
Цитата:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
VVA, Сегодня на работе все с ума сошли. Не получится самому что-то попробовать, душат со всех сторон. Не успею даже толком ознакомится с твоим кодом, но если это то о чем я говорил в посте #445, то прошу соеденить это с главным кодом, последняя версия которого находится на #445 (первый код)
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
А, еще один момент - (member) можно посмотреть )
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
По поводу #445 A.
Здесь 1001 алгоритм удаления дублирующих элементов. Форум требует регистрации. Приведу первые 2 по скорости алгоритма: Алгоритм MP1 Код:
Код:
Код:
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 29.09.2008 в 11:44. |
|||
![]() |
|
||||
Конструирование в области нефтеразведки Регистрация: 10.02.2006
Гомель
Сообщений: 321
|
>Red Nova #453
Прежде чем помогать дальше, лично я хотел бы для начала разобраться со списком spisok, а именно: 1. Что есть такое - "\U+E72E" "\U+E720" "\U+E729" "\U+E725" (у меня все они отображаются как знак квадрата). Хотя наверняка это символы уголка, двутавра и т.д. из СПДС? 2. Почему список ограничен номером 20 - "20%%c", "20 %%c", "20\U+E712", "20 \U+E712"? Что "25%%c" или "120%%c"не может быть? Ну и еще одна ф-ция для удаления дубликатов: Код:
|
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Под словом модифицированные я понимаю "оптимизированные"
![]() "Скорострельность" проверять на больших списках (например из #445), предварительно отсортированных - (setq spisok (vl-sort spisok '<)) Код:
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Дима_,
Даже на больших и отсортированных списках benchmark дает Код:
Цитата:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
CB,
Цитата:
Цитата:
Дима_, Цитата:
__________________
Блог |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
То VVA чем меньше список тем быстрее "простой перебор", его можно оптимизировать экономя байты - но эта оптимизация в пределах нескольких процентов, а check3_1 - это совсем другой алгоритм, он не быстро "все подряд" перебирает, а интелектуально! А если spisok до тысячи дорастет? Как тогда Benchmarking'и будут выглядеть, а до 10 тыс.?
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
![]()
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
По условиям #445 A, B.1, B.2 Изменения выделены красным
Код:
(setq spisok (list "\\U+E72E" ) *** Добавлено Автоматически приклеились ссылки, прикрепляю файл. Проверка-функция test2
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 29.09.2008 в 22:33. |
|||
![]() |
|
||||
VVA, Спасибо, но пока не все гладко.
При загрузке пишет Код:
Код:
Код:
__________________
Блог Последний раз редактировалось Red Nova, 29.09.2008 в 21:32. |
||||
![]() |
|
||||
VVA,
Цитата:
![]()
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Red Nova, В #465 я писал
Цитата:
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 29.09.2008 в 22:34. |
|||
![]() |
|
||||
Только дошел смысл этих строк.
Пробовал (test) Вот результат работы этого лиспа для списка с #466 Код:
(test2) выдает Код:
У тебя в коде есть также символы с тремя слешами, типа Код:
__________________
Блог |
||||
![]() |
|
|||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Цитата:
Цитата:
Цитата:
__________________
Как использовать код на Лиспе читаем здесь |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
К вопросу о фильтрации других СПДС-объектов (точнее, выносок)
Голова что-то соображает достаточно хреново, поэтому только такой код смог "родить": Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Кулик Алексей aka kpblc, Спасибо большое. Наконец и другие выноски можно добавить к списку. (к стати в коде указан неверный пример вызова команды)
Вот пример полученного таким путем списка. Цитата:
В список так же стали приписываться цифры 1 и 2 (наверное количество стрелок) ("Узел" "" "1" 1) ("Греб" "Выноска" 2) Поскольку часть алгоритма для фильтров уже написана для списка не учитывая количество стрелок (да и вряд ли это нужно), думаю от этого нужно избавиться. Если не затруднит, то прошу это сделать. VVA, Цитата:
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Red Nova, я количество сознательно сделал. В качестве задания: у тебя есть список вида
Код:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Провел сравнительный анализ, скорости выполнения разных вариантов программы. Результаты выкладываю.
Коды для сравнения: Код:
Код:
первый элемент из 92 Код:
Код:
Код:
Код:
Код:
|
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
А что-ж check3_1 из #459 не добавил? Тоже хочу в соревновании побыть, правда для нее список маловат конечно.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Цитата:
Но советую исправить ошибки в своей программе check3_1... Код:
Код:
результаты тестирования: первый элемент из 92 Код:
Код:
Код:
Код:
Код:
Код:
Код:
Код:
Код:
Код:
|
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
To Елпанов Евгений, наверное не внимательно #459 читал - список надо предварительно отсортировать - он не все подряд перебирает, как другие:
Из 459: ""Скорострельность" проверять на больших списках (например из #445), предварительно отсортированных - (setq spisok (vl-sort spisok '<))" P.S. ну в нашем случае вместо spisok lst разумеется и будет CHECK3_1 "20 \U+E712" LST) T
__________________
Когда в руках молоток все вокруг кажется гвоздями. Последний раз редактировалось Дима_, 30.09.2008 в 13:03. |
|||
![]() |
|
||||
Крыс
На работе до сих пор прессуют.Пока придется забыть про обучение лиспу в рабочие часы. ![]() Прошу, если не затруднит, подправь то о чем я говорил в твоем последнем коде и соедини этот код с лиспом где присутствуют последние фильтры от VVA. (он на #465 прикреплен отдельным файлом.) P.S. Знаю что от просьб объяснить я постепенно перешел к просьбам просто сделать за меня. Ну очень уж хочется окончательный лисп заполучить. А на нем учиться оказалось чересчур сложно. Колонну я еще лиспом чертил, а на списки не тяну.
__________________
Блог Последний раз редактировалось Red Nova, 30.09.2008 в 14:44. |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Red Nova, так и мне в общем-то тоже не особо вздохнуть... Я за сегодня с 8 утра еще ни строки кода не написал (а сдавать результат надо в пятницу).
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
kpblc Тебе и на том что сделал большое спасибо, без тебя этот код с места не сдвинулся бы.
![]()
__________________
Блог |
||||
![]() |
|
||||
ALL
Самому не получается скрестить новый код преобразования выносок в список (от крыса, пост #472) и последний вариант кода со старым алгоритмом преобразования выносок содержащим фильтры (последний вариант от VVA в прикрепленном файле на #465) Приведу их по отдельности новый код преобразования выносок в список Код:
Код:
Код:
Код:
__________________
Блог Последний раз редактировалось Red Nova, 30.09.2008 в 14:46. |
||||
![]() |
|
||||
Вай, забыл. Это же из за того, что новый аглоритм крыса выдает список вот в каком виде.
Код:
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
VVA, в выноске может быть и 3 строковых элемента )
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
kpblc, Ты должно быть про узловую выноску говоришь. Так я закомментировал ее на #485
Код:
Теперь может быть точно только 2 строковых элемента
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Я бы все же разрабатывал более универсальный код )
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
В узловых выносках я ни разу не ставил позиции, да и не видел чтобы другие ставили. Не думаю что это кому-то пригодится.
Но зато в узловых выносках я часто отмечаю номер узла и адрес страницы. ("1" "Лист-5") Получается так, что установленные мною фильтры пропустят этот список ![]()
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Кхе, это зависит от специфики работы. У меня, например, как раз узловые являются основными
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Ну тогда когда освободишся поправь код как посчитаешь нужным, если не лень (я про три элемента в списке). А я у себя узловые могу закомментировать.
__________________
Блог |
||||
![]() |
|
||||
А пока, учитывая последнюю заметку от VVA, код получился такой. (Работает)
Код:
__________________
Блог Последний раз редактировалось Red Nova, 30.09.2008 в 20:38. Причина: учел #495 |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Вот вариант с удалением ВСЕХ НЕ СТРОК
Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
VVA, VVA, а я так хотел, чтобы Red Nova сам нарисовал вариант...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
All
Обновил код на #494 (c учетом #495). На данный момент имеем код, который значительно фильтрует не нужную информацию. Почти все фильтры уже готовы. Осталось вот что. 1. Отфильтровать подобные позиции Допустим имеем такой список. Код:
А. Проверить есть ли в одном из списков запятая. Если есть, то надо удалить все, которые запятой не содержат, если ни один элемент не содержит запятых, то ничего не удаляем. На данном этапе получим Код:
Получим Код:
2. Теперь список надо расставить по порядку. Вот на мой взгляд нужная очередность: 1, 1’, 1”, 1a, 1b, 1c, …1d, 1e, 1f, 1g, 1а, …1б, 1в, 1г, 1д, 1е, …2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, … A1, A2, A3, a1, a2, a3, a5, B1, B2, B3, b1, b2, b3, b4, b5, C1, C2, C3, c1, c2, c3, c4, c5, … A1, A2, A3, а1, а2, а3, а5, Б1, Б2, Б2, б1, б2, б3, б4, б5, в1, в2, в3, в4, в5 Как всегда прошу помочь кому не лень. ![]()
__________________
Блог |
||||
![]() |
|
||||
kpblc, Мне действительно лучше учиться на более простом. Я так часами могу о стенку головой биться. Вот другое дело было упражнение от VVA про колонну.
А этот лисп засел в мозгах и не выходит. Все хочиться его поскорее пощюпать в работе. Если на нем учиться, то в лучшем случае я его закончу через год-два ![]() Добавлено К стати, все что связанно с lambda(x) я не понемаю. Читал справку, смотрел примеры, а толку мало Крыс Еще добавлю.О узловых выносках. Я не знаю какую у вас в ней пишут информацию (в какой строке что пишут). Подходят ли этой информации наши фильтры?
__________________
Блог Последний раз редактировалось Red Nova, 30.09.2008 в 22:04. |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
У тебя число обязательно присутствует в элементах списка?
P.S. Может, lambda по ходу дела рассказать? P.P.S. Что-то я, похоже, погорячился с числами... Вариант "число сначала" делается без вопросов, а вот "сначала символ, потом число" - что-то не срослось.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. Последний раз редактировалось Кулик Алексей aka kpblc, 30.09.2008 в 22:45. |
|||
![]() |
|
||||
Цитата:
Цитата:
__________________
Блог |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Что бы было понятней, что такое lambda вначале опишу что такое apply и mapcar:
apply Fn lst - применяет функцию Fn к списку lst, например: (apply '+ '(1 2 3)) эквивалентно (+ 1 2 3) что вернет 6. (mapcar Fn lst1 lst2 ... lstn) - применят функцию Fn к каждому элементу из каждого списка, ответ возращает в виде списка ответов, количество списков (lst1, lst2...) должно соответствовать количеству аргументов функции Fn, например: (mapcar '+ (list 1 2 3) (list 10 20 30)) эквивалентно (list (+ 1 10) (+ 2 20) (+ 3 30)), что вернет (11 22 33). Если мы, в качестве функции Fn хотим использовать какую-либо свою функцию, то мы должны либо предварительно создать ее используя (defun), но тогда нам придеться придумывать ей имя, либо использовать (lambda), синтаксис точно такой-же как у (defun) только без имени - а с defun'ом мы вроде уже разбирались. Пример: (mapcar '(lambda (a b c) (- (+ a b) c)) (list 1 2 3) (list 10 20 30) (list 4 5 6)) эквивалентно (list (- (+ 1 10) 4) (- (+ 2 20) 5) (- (+ 3 30) 6)), что вернет (7 17 27)
__________________
Когда в руках молоток все вокруг кажется гвоздями. Последний раз редактировалось Дима_, 01.10.2008 в 00:13. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
"Первоклассник" уже понимает mapcar?
![]() --- Опа, пока я чесал репу, тут уже практически все рассказали ![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. Последний раз редактировалось Кулик Алексей aka kpblc, 01.10.2008 в 00:16. |
|||
![]() |
|
||||
Конструирование в области нефтеразведки Регистрация: 10.02.2006
Гомель
Сообщений: 321
|
>Дима_
Цитата:
(apply Fn lst) - выполняется функция Fn, аргументы которой заданы списком. Например классика: (apply 'mapcar (cons 'list '((1 2) (10 20)))) -> ((1 10) (2 20)) Что здесь lst - (cons 'list '((1 2) (10 20))) -> (LIST (1 2) (10 20)) В этом списке первый элемент, зто аргумент функция для (mapcar функция lst1 lst2...), следующие - это аргументы lst1, lst2 для нее же. |
|||
![]() |
|
||||
Спасибо, вроде как понял.
Значит это (setq lst (mapcar '(lambda(x)(list (car x)(cadr x))) lst)) можно понять, как: к каждому элементу списка lst применить функцию создающую список из первых двух элементов первоначального списка.
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
К каждому элементу списка lst применить фунцию, которая создает список из первых двух элементов каждого подсписка.
Наверное, так будет правильнее.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Не у кого идей по #497 нет?
![]()
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Пока нет. Лично у меня не получилось абсолютно корректно сформировать список вида '("1" "1'" "1''" "2" "2a" "2A" "3" "4b" "10a" "A1" "A3" "A10" "A21"). Проблема (пока) именно в последних 4 элементах.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Хотя нет, лови:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
kpblc, Спасибо. Эту функцию можно применить, когда имеем обычный список. А как ее использовать в нашем случае, когда список парный?
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
В качестве параметров в анонимные функции попадают тогда не строки, а списки. Обработка не меняется, просто подставляются первые элементы списка.
P.S. Тут задумался - может, кто более быстрый алгоритм предложит да в библиотеку такую функцию сортировки строкового списка закинет?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Если я верно понял, то можно добавить этот код в таком виде в наш лисп. Я попробовал, но пока не работает.
Код:
__________________
Блог |
||||
![]() |
|
||||
Конструирование в области нефтеразведки Регистрация: 10.02.2006
Гомель
Сообщений: 321
|
>Red Nova
По скорости, с которой ты выдаешь ТЗ на лисп, Benchmark наверняка бы поставил тебя на первое место. ![]() Во всяком случае протестируй пока новый лисп, в котором пока нет окончательной сортировки (над ней стоит еще подумать...) Код:
Последний раз редактировалось CB, 02.10.2008 в 09:22. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
CB, возможно, дело в настройках самой VLIDE:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
CB, Спасибо. Правда фильтрует и некоторую полезную информацию. Прикрепляю файл, в котором показано что фильтруется неверно. Зато ты добавил алгоритм удаления подобных позиций. Можно вставить его в код с #494, там все остальное работает нормально.?
Цитата:
![]() ALL На данный момент есть три кода, которые хотелось бы объединить в один. 1. Совместный код с #494. Там все работает нормально, не хватает фильтра удаления подобных позиций и функции упорядочивания. 2. Код для упорядочивания списку от Крыса на #508. 3. Код от СВ c #512, который работает не совсем верно, но содержит фильтр удаления подобных позиций. Возможно взять код с #494 и добавить в него Код для упорядочивания списка с #508 и фильтр подобных позиций c #512? Я сам пытался скрестить код с #494 и с #508. Пока не выходит. Supermax, Верно подметил.
__________________
Блог |
||||
![]() |
|
||||
Конструирование в области нефтеразведки Регистрация: 10.02.2006
Гомель
Сообщений: 321
|
>Red Nova #516
В принципе все ясно. Синий текст нужно сделать в одну строчку: Имеется: Код:
Код:
|
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Код:
Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
CB,
Пока не корректно работает. Если к примеру имею выноски с содержанием ("3" "Фл. 300х8") ("3" "Фланец 300х8") то отфильтровывается верно ("3" "Фланец 300х8") Но если имеем ("3" "Фл. 300х8") ("3" "Фланец 300х8") ("3" "дверь") То возвращяет nil. VVA, Код с #518 пойдет для нашего лиспа? Может его как-то надо адаптировать к парному списку?
__________________
Блог Последний раз редактировалось Red Nova, 02.10.2008 в 15:40. |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Пока СВ размышляет над исправлением #512 хочу напомнить остальным про мою просьбу написать фильтр подобных позиций.
Допустим имеем такой список. Код:
А. Проверить есть ли в одном из списков запятая. Если есть, то надо удалить все, которые запятой не содержат, если ни один элемент не содержит запятых, то ничего не удаляем. На данном этапе получим Код:
Получим Код:
__________________
Блог |
||||
![]() |
|
||||
CB,
Спасибо. То о чем я говорил исправленно, но заметил, что при испытании не вошли в список следующие выноски ("а1" "-10х100х200") ("а2" "-10х100х300")
__________________
Блог |
||||
![]() |
|
||||
CB, Спасибо. Теперь заработало. Правда я тебя не собираюсь оставлять в покое.
![]() Соеденив твой код с сортирующим кодом от VVA я получил Код:
Теперь очередная просьба: 1. Во первых я кое о чем забыл. В самом начале фильтрации списка нужно удалить первые и последние пробелы элементов подсписка, если таковые есть, на пример ("1 " " -10х100x100"), тут после позиции и до знака – есть такие пробелы. Часто бывает поставишь лишний пробел, а он потом не виден. Не хотелось бы из за этого терять некоторые позиции. Удаление лишних пробелов нам понадобится еще раз, но чуть позже. 2. Следующим шагом я наметил раздел списка на три части. Напомню что вторая строка некоторых позиций содержит запятую. На пример ("7" "-4х50, L=1000") А некоторые позиции запятой не содержат вовсе. Нужно определить содержит ли вторая строка запятую, если да, то надо взять все то что идет после запятой, и записать в новый, третий элемент подсписка. Если вторая строка не содержит запятых, то нужно записать в новый, третий элемент подсписка знак – Пример. Имеем. (("7" "-4х50х1000") ("8" "Уголок 50х5, L=1000")) Получим (("7" "-4х50х1000" "-") ("8" "Уголок 50х5" " L=1000")) 3. К полученному тройному списку опять применяем функцию удаление лишних пробелов.
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Выход: 1.Не использовать " (заменить, например, буквами) 2. Вместо " использовать '' (два символа ') По п.1 Этот фрагмент Код:
Код:
По п.2,3 Дополнительны ф-ции Код:
Код:
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 04.10.2008 в 19:46. Причина: Изменение аглоритма |
|||
![]() |
|
||||
VVA, Спасибо. Сделал так как ты говоришь.
Код получился такой Код:
1. Третий элемент подсписка создается, но только для тех позиций, которые содержат запятую. Нужно чтобы и для элементов без запятой создавался третий элемент, с минусом в содержании "-". Хотя может и без этого дальше можно обойтись, но лучше чтобы это было реализовано на этом этапе. Добавлено. Знак “-” должен приписываться третьим элементом только для позиций, вторая строка которых начинается на “-” “Лист” “Фл” Для остальных позиций третьим элементом должно приписываться “L=” 2. К сожелению некоторые фильтры перестали работать. Вот например не отфильтровались данные позиции. ("АС" "Двутавр") ("Торец" "фрезеровать") ("1АС" "Швеллер") Добавлено Обнаружил, что указанные в пункте 2 неполадки появились когда я в #525 пытался скрестить код от СВ с кодом сортировки от VVA, опять напортачил ...
__________________
Блог Последний раз редактировалось Red Nova, 04.10.2008 в 19:11. |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Red Nova, А что будет, если ни в одной строке не будет запятой? Мне кажется, что минус не нужет. Признаком отсутствия третьего элемента может быть длина списка или nil при попытке вдять третий элемент списка.
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
VVA,
Цитата:
Цитата:
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Red Nova, Обновил #526 Выделил синим
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
VVA, Обновил #527
Теперь для всех элементов не содержащих информации о длине создается третий элемент “-”. 1. А можно удовлетворить и это требование Цитата:
Цитата:
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
По п.1. изменил #526
по п.2 нет времени, еду в командировку.
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
VVA,
Спасибо, Приятного времяпровождения All Кто знает как правильно соединить код от CB c #524 и код сортировки списка от VVA c #518? Я в #527 пытался это сделать, чета напортачил, и лисп перестал работать корректно.
__________________
Блог |
||||
![]() |
|
||||
Конструирование в области нефтеразведки Регистрация: 10.02.2006
Гомель
Сообщений: 321
|
>Red Nova
Окончательная сортировка сделана по тому же алгориту, что и у VVA #518, только по другому реализовано, соответственно остались и те же недостатки... Код:
Последний раз редактировалось CB, 06.10.2008 в 11:21. |
|||
![]() |
|
||||
CB, Как всегда большое спасибо
![]() Почти все работает корректно. 1. Один только баг нашел. Выноски с содержанием типа (“a2” “-10x100x100”) (“a3” “-10x100x200”) не попадают в список. Хотя (“a1” “-10x100x300”) попадает. То есть проблема с выбором позиций, у которых в первой строке после буквы идет цифра отличная от единицы. 2. Еще одна просьба. Я похоже не учел еще один необходимый фильтр. Часто во второй строке позиции после запятой пишут не длину профиля, а его шаг. К примеру (“1” “12 АIII, шаг 200”). Нашими имеющимися фильтрами эта строка может пройти в спецификацию. А она там не нужна. Чтобы это исправить нужен вот какой фильтр. В том месте, когда мы уже отфильтровали все выноски, получили парный список, но еще не удалили подобные позиции нужно вклинить такой алгоритм. Проверяем есть ли во второй строке запятая. Если нет, то ничего не делаем. Если запятая есть, то проверяем что идет после запятой (Пробелы не учитываем). Если после запятой написано (L=…..) или (\\U+03A3L=…..), где \\U+03A3 – это знак сигма, то позицию оставляем в покое, если после запятой идет что-то другое, то удаляем все что идет после запятой вместе с ней же. В (\\U+03A3L=…..) и (L=…..) между буквани добускается ставить пробелы.
__________________
Блог |
||||
![]() |
|
||||
Конструирование в области нефтеразведки Регистрация: 10.02.2006
Гомель
Сообщений: 321
|
>Red Nova
По первому пункту - совершенно не понятно что у тебя за списки (“a2” “-10x100x100”) (“a3” “-10x100x200”) - чего это у тебя кавычки в разные стороны Проверил нормальный список - все корректно: Код:
|
|||
![]() |
|
||||
На кавычки не обращай внимания, это от шрифта в котором я набирал сообщение. Я то проверял на выносках а не на готовом списке. Вообще что-то странное. На работе все заработало корректно, а дома a2, a3 не вписывались. Ну да ладно. Потом проверю опять. Пока забудем это.
__________________
Блог |
||||
![]() |
|
||||
Конструирование в области нефтеразведки Регистрация: 10.02.2006
Гомель
Сообщений: 321
|
По п.2.
Цитата:
Код:
Короче, если "камень преткновения" это слово "шаг", все можно было бы сделать гораздо проще: Код:
|
|||
![]() |
|
||||
В принципе так тоже пойдет, если только шаг брать в расчет. Но тогда нужно кроме "шаг" добавить и "ш.".
Моим алгоритмом отфильтровалось бы все лишнее, если кто-то написал бы после запятой любое свое примечание. К примеру ("4" "Швеллер 12, сверху") ("4" "Швеллер 12, шаг 1000")... Цитата:
("2" "Швеллер 12, L=1000") Но ты прав, я описал принцип не очень точно. Нужно проверить есть ли во второй строчке запятые. Если есть, то смотрим что идет за первой запятой, если это не (L=…..) или (\\U+03A3L=…..), то все что идет после первой запятой удаляем вместе с ней. Таким образом если список такой (setq lst '(("2" "Швеллер 12, L=1000, шаг 1000") ("3" "Швеллер 12, L=1000") ("4" "Швеллер 12, шаг 1000") ("5" "Швеллер 12"))) то станет таким (setq lst '(("2" "Швеллер 12, L=1000, шаг 1000") ("3" "Швеллер 12, L=1000") ("4" "Швеллер 12,") ("5" "Швеллер 12"))) А далше уже будут работать ранее написанные фильтры. Если надумаешь написать этот алгоритм, то внедри его пожалйста сразу в основной лисп, а-то я опять перепутаю куда его сувать .
__________________
Блог Последний раз редактировалось Red Nova, 06.10.2008 в 10:40. |
||||
![]() |
|
||||
Тестирую выноски с таким содержанием вторых строк
Швеллер 12, шаг 1000 Швеллер 12, шаг 1000, 2000 возвращяет (("1" "Швеллер 12" "-") ("2" "Швеллер 12" "шаг 1000"))
__________________
Блог |
||||
![]() |
|
||||
Теперь заработало.
Заметил что одно условие надо доработать. Я уже писал это для VVA, он делал исправление в своем коде, но ты его наверное не использовал. Цитата:
__________________
Блог |
||||
![]() |
|
||||
Код:
__________________
Блог |
||||
![]() |
|
||||
Конструирование в области нефтеразведки Регистрация: 10.02.2006
Гомель
Сообщений: 321
|
Это из-за того, что у меня нет СПДС, так я для себя сделал ввод списка...
Исправлено в #544 |
|||
![]() |
|
||||
CB,
Отлично. Спасибо. Теперь все оно. Осталось совсем мало. Добавить ГОСТы и вписать все в заранее подготовленный шаблон. Во первых подспискам нужно приписать новый четвертый элемент, причем сначала. Этот элемент будет содержать информацию о ГОСТе. Алгоритм такой. -Проверяем на какие символы начинается второй элемент, и в зависимости от этого приписываем спереди различные госты. Вот список возможных профилей и гостов. ГОСТ 19903-74 соответствует профилям начинающимся на символы “-”, “лист -”, “лист-”, “Фл”, Причем если профиль начинается на “-”, то должно проверяться условие, что третья строка подсписка содержит только “-”, если она содержат что-то другое, то это другой гост, о нем далее. ГОСТ 103-76 соответствует профилям начинающимся на символы “-”, “Полоса”, сюда для символа “-” попадают все позиции не вошедши в предыдущий гост. К примеру ("1" "-10х100x100" "-") ("2" "-5х50" "L=1000") ("ГОСТ 19903-74" "1" "-10х100x100" "-") ("ГОСТ 103-76" "2" "-5х50" "L=1000") ГОСТ 8568-77 соответствует профилям начинающимся на символы “ Лист ромб”, “Лист чечевица” ГОСТ 30245-03 соответствует профилям начинающимся на символ “\\U+E72E” (символ квадрата) ГОСТ 10704-91 соответствует профилям начинающимся на “Тр” (В англ и рус правописании) ГОСТ 8509-93 соответствует профилям начинающимся на “Уголок”, “\\U+E720”, и содержащим далее в тексте только один символ “х” (В англ и рус правописании) ГОСТ 8510-86 соответствует профилям начинающимся на “Уголок”, “\\U+E720”, и содержащим далее в тексте два символа “х” (В англ и рус правописании) К примеру ("1" "Уголок 75х5" "-") ("2" "Уголок 80х50х5" "-") Станет ("ГОСТ 8509-93" "1" "Уголок 75х5" "-") ("ГОСТ 8510-86" "2" "Уголок 80х50х5" "-") ГОСТ 8239-89 соответствует профилям начинающимся на “Двутавр”, “\\U+E729” ГОСТ 8240-97 соответствует профилям начинающимся на “Швеллер”, “\\U+E725” ГОСТ 5781-82 соответствует профилям начинающимся на “%%c”, “\\U+E712”
__________________
Блог |
||||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Что-то мне кажется, что тема научите лиспу разлилась по древу и ушла в частности. Начиная с поста #397 прицепились к позиционным выноскам СПДС и далее пошли многочисленные разборки. Конечно, по ходу были и очень хорошие примеры, которые будут полезны всем, но всё же....
Red Nova еще долго будет сообщать "осталось совсем мало". Типа, только все ГОСТ добавить (а все не добавить). Какой ГОСТ чему соответствует и т.д. А ведь задачу надо решать в общем виде и универсально. Сводится-то к тому, что надо записать в спецификацию. Частный случай (пока) из выносок СПДС. Потом появятся множество других вариантов (из простых текстов, из атрибутов, из Leader, из MLeader, из черта рогатого, из дьявола хвостатого. И никакой гарантии, что спецификация правильная, так как может быть что-то вообще не нарисованное, или нарисованное, но не позиционированное, или позиционированное, но не так. Если уж учиться, то, как я уже писал где-то в начале ветки - с продумывания и постановки задачи. С тщательного продумывания, а не латания дыр на мосту, который строят вдоль реки, а не поперёк. |
|||
![]() |
|
||||
Конструирование в области нефтеразведки Регистрация: 10.02.2006
Гомель
Сообщений: 321
|
>ShaggyDoc
Собственно говоря, прочитав вчера вечером #547, я пришел приблизительно к тому же выводу - это все до бесконечности и сегодня хотел предложить Red Nova продолжить программу самостоятельно, тем более, что задача в #547 не сложная - правильно составленный ассоциативный список, apply, mapcar - это практически и все. А помощь я думаю будет оказана... |
|||
![]() |
|
||||||||
ShaggyDoc
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
CB, Цитата:
![]()
__________________
Блог |
||||||||
![]() |
|
||||
Крыс
Как смотришь на то, чтобы перенести все начиная с #397 в Копирование данных для спецификаций из выносок СПДС в таблицу из мтекстов? А-то темка когда-то действительно была полезной многим. Надо бы тут подчистить.
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Проблема в том, что эти темы (обе) слишком сильно переплелись. В текущей теме и обучение, и спор, и готовые коды...
У меня сейчас нет никаких шансов вдумчиво разбираться. Но если хочешь - могу перетащить все, начиная с #397 в указанную тобой тему. Только, боюсь, как бы кавардака не получилось... У меня другое предложение: в "Копировании выносок..." ты создаешь новый пост, в котором указываешь ссылки на самые интересные и нужные коды в этой теме. Доработку продолжать в той теме. Эту (временно) закрыть. Захочешь продолжить самообучение - сообщи, открою. Как тебе такой вариант?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Согласен, но думаю тему можно и не закрывать. Просто просим всех продолжить данные дебаты в новом месте.
Объявление Чтобы не засорять этот топик, дальнейшее обсуждение по теме о преобразовании списков переходит в топик Копирование данных для спецификаций из выносок СПДС в таблицу из мтекстов Всех тех, кому еще не окончательно надоели мои просьбы прошу посетить эту тему. Все дальнейшие дебаты продолжим там.
__________________
Блог |
||||
![]() |
|
||||
Нужно сделать программу которая изменяла бы некоторые переменные при открытии файла. Как это загнать под одну команду я знаю, а вот как сделать, чтобы эта команда сама вызывалась при открытии нового файла не имею понятия. Прошу направить на путь истенный.
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Загоняй в автозагружаемый лисп и всего делов...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Кулик Алексей aka kpblc,
Блин, действительно. DEM, У меня для лиспов свой каталог, я просто недапетрил что если в файл lsp записать не команду а просто строчку к примеру типа (setvar "mirrtext" 1) то она будет каждый раз прогонятся при открытие нового файла.
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
DEM, acaddoc имеет одну неприятную особенность... Если встречается первый, то все остальные acaddoc'и не грузятся.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Помогите. Нужна идея.
Нужно ограничить неправильный ввод точки юзером. Начальные данные - точки P1 P2 P3. Условие такое (angle p1 p2) < (angle p1 p3) < (angle p1 p2) +180 т.е. если условие не выполняется, заново задается точка P3. Реализую через while. Проблема в том, что условие для while задается через and. А когда какое либо из условий and не выполняется, and возвращает nil, что естественно, и цикл прекращается. Есть какой-то другой способ решить мою задачку? А то я многого не знаю... Надеюсь понятно объяснил Код:
__________________
14 Ибо если вы будете прощать людям согрешения их, то простит и вам Отец ваш Небесный (Мф 6, 14) |
||||
![]() |
|
||||
Donhuan, все так! Спасибо.
Но вот условие я задал изначально не совсем верно. Пытаясь скорректировать условие, нагородил забор. Вроде должно работать, а не работает. В эту конструкцию Код:
Код:
Код:
Получилось вот что Код:
![]()
__________________
14 Ибо если вы будете прощать людям согрешения их, то простит и вам Отец ваш Небесный (Мф 6, 14) Последний раз редактировалось wetr, 19.01.2009 в 13:34. |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
wetr, Для нормализации угла ( угол в диапазоне 0 - 360 градусов) можешь использовать эту ф-цию
Код:
Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Инженер-строитель Регистрация: 15.08.2007
Киров
Сообщений: 2,204
|
Надо получить дробную часть от числа и преобразовать её в целое число. Причём у дробной части надо взять только 1-е 4 цифры (т.е. просто усечь, а не округлить).
Вроде как надо так. Код:
Цитата:
|
|||
![]() |
|
||||
Проектировщик СС Регистрация: 24.06.2008
Минск
Сообщений: 134
![]() |
Могу ответить только дежурной фразой: такова особеность представлеия real в lisp.
Пример: Код:
Код:
Код:
Код:
Код:
В догонку: http://www.caduser.ru/cgi-bin/f1/board.cgi?t=21661WW Последний раз редактировалось Donhuan, 27.01.2009 в 19:19. |
|||
![]() |
|
||||
Раз уж тут помогают, то я тоже хочу задать несколько вопросов, т.к. тоже считаю себя чайником.
Вопросы: 1)Что значит "тихий выход". Какая разница между тем написать функцию (princ) в конце или нет? 2)Как в лиспе нарисовать, например, параболу таким образом, чтоб она состояла не из отрезков линий а из целой линии. Код:
Надеюсь вопрос ясен. Последний раз редактировалось Eximius, 31.01.2009 в 17:26. |
||||
![]() |
|
||||
Проектировщик СС Регистрация: 24.06.2008
Минск
Сообщений: 134
![]() |
1. Все функции лиспа возвращают какое-либо значение, при выходе из функции в ком. строку возвращается последнее вычисленое значение ("мусор"). Функция (princ) не возвращает ничего, поэтому если ее вставить последней в тело функции, то в ком. строке ничего не появится.
2. Код:
Последний раз редактировалось Donhuan, 31.01.2009 в 21:20. |
|||
![]() |
|
||||
Регистрация: 12.07.2008
Сообщений: 211
|
Подскажите, пожалуйста, как мне провернуть следующее.
Составляю небольшую прогу для экспорта/импорта профилей .arg. Вот кусок кода: Код:
![]() Всем спасибо! Сам родил ![]() Код:
![]()
__________________
Users are not stupid, they are busy. Последний раз редактировалось acyxou, 02.02.2009 в 18:48. |
|||
![]() |
|
||||
Хочу кое что записать при помощи лиспа в таблицы но понятия не имею о том как с ними работать. Посоветуйте пожалуйста самые основные функции.
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Red Nova, http://arcada.com.ua/forum/viewtopic.php?t=1095
http://arcada.com.ua/forum/viewtopic.php?t=945 http://arcada.com.ua/forum/viewtopic.php?t=698 http://arcada.com.ua/forum/viewtopic.php?t=440
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Спасибо.
А как создать таблицу c определенным количеством колонок и строк и записать в определенные ячейки что либо?
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Да так же, в общем-то
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
Но масса нюансов, связанных с оформлением - точные размеры, вес линий, объединение ячеек шапки. Например, vla-settext может испортить оформление ячейки. И многое надо самостоятельно изобретать - где и как хранить описание таблицы, откуда брать тексты и прочее. |
|||
![]() |
|
||||
kpblc,
Цитата:
__________________
Блог |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Да штож такое: Red Nova - ведь должен уже лучше Крыса lisp знать.
Код:
например (maketable (getpoint) 5 5 5 5)
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Red Nova, Примеры у тебя есть. Смотри vrc, в частности пост #5. Нужное выделил красным
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
> ShaggyDoc: а кому обещали, что будет легко?
![]() > Red Nova: А вообще-то лучше всего создавать свой стиль табличный, с ним и играться, не надеясь вообще ни на что ![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Спасибо за ответы
Дима_, Цитата:
![]() All Успехи пока нулевые. В хелпе отсутствует информация по vla-addtable и его структуру я не понимаю. От VVA пример больно сложный. Там все vla функции о которых я не имею понятия. А вообще можно без vla функций обойтись? В примере от Димы мало настроек, и пока что кажется что создать таблицу с требуемой мне структурой (ведомость расхода стали по ГОСТ) будет весьма сложно. В приложенном файле есть пример такой таблицы (правда в файле она из линий и мтекстов)
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Red Nova, лично мне для начала работы очень сильно помогла статья на http://www.cad.dp.ua/stats/vla_doc.php
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
1. Синтакис всех vla- функций находиться в хелпе по VB, там же есть инструкция по переводу синтаксиса VB в VL, да и где-то на форуме она есть на русском языке.
2. Если без vla, то либо командными методами, либо через DXF, в первом надо слишком много учесть, во втором слишком много изучить, лично мне DXF больше нравиться (позволяет во сремя создания сразу задать все параметры), но для таблиц, областей и 3Д объектов - гемор. И тут приходят на помощь готовые решения на VLA (VBA). Так что если нужны таблицы пора начинать изучать VL.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
kpblc, Спасибо, статья очень полезная. В общем понял как при помощи VLA- создавать и модифицировать таблицы, даже получается.
Теперь пытаюсь подготовить нужную информацию для последующего заполнения таблицы. Есть несколько как всегда примитивных вопроса, на этот раз про работу со списками. 1. Как создать пустой список? 2. Как проверить при помощи wcmatch пуст ли он? 3. Как от элемента списка оставить только последнюю букву? имею "Арматура d= 8", нужно оставить только "8" 4. Как сосчитать количество элементов списка?
__________________
Блог Последний раз редактировалось Red Nova, 28.02.2009 в 15:06. |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
1. А зачем его создавать? Инициализируй любую переменную - вот тебе и пустой список.
2. С помощью wcmatch проверяется не список, а строка 3. См. subst 4. См. length
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Спасибо.
Кое что уже получается. Уже рисуется таблица Код:
Вот тут Код:
Прошу подсказать как.
__________________
Блог Последний раз редактировалось Red Nova, 28.02.2009 в 20:00. |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Как вариант можно так
Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
VVA,
Спасибо. Правда пока что не интегрировал в свой код, но это успеется. Дима_, Согласен. Ты еще в моих кодах много лишнего увидишь. Holon, Мне бы пока с таблицами разобраться. К стати, оказывается с помощью vla их можно очень легко редактировать. В общем пока продолжаю писать код преобразования спецификации с ведомость расхода стали, скора ждите новых вопросов. Ну вот и вопрос. Почему не заработала элементарная функция чтения содержимого текста или атрибута? Код:
__________________
Блог Последний раз редактировалось Red Nova, 02.03.2009 в 23:08. |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Добавлю: см. в библиотеке функций _dwgru-conv-pickset-to-list : http://forum.dwg.ru/showpost.php?p=188342&postcount=21
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Red Nova,
1. Не факт, что в ssget будет блок. Это я к тому, что ssget нужно делать с фильтром Код:
Код:
Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Donhuan, kpblc,
Пока чтоне понял что там к чему. Опять не вышло Код:
Код:
__________________
Блог Последний раз редактировалось Red Nova, 03.03.2009 в 14:11. |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
1. Red Nova, Ты отладчиком посмотри что у тебя в l_vla_obj?
2. У табя там список а ты пытаешься взять у списка свойство TextString ![]() 3. У блока НЕТ свойства TextString, оно есть у Атрибута, а Атрибут это один из элементов БЛОКА, поэтому чтобы добраться до Атрибута, нужно поковырять блок еще немного. 4. Фильтр ssget неверен. Нужно добавлять логические группы (-4 . "<OR"), (-4 . "<AND") и т.д. Еще про атрибуты http://forum.dwg.ru/showthread.php?t=14230 http://www.caduser.ru/forum/index.ph...D=23&TID=35337 http://www.caduser.ru/forum/index.ph...#message243276 http://www.caduser.ru/forum/index.ph...#message148413 http://www.caduser.ru/forum/index.ph...5&FORUM_ID=23&
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
l_vla_obj возвращяет к примеру
(#<VLA-OBJECT IAcadMText 0bdabf24>) Что это такое, и что с этим делать? Поковырялся в лиспах от VVA, но бестолку, там стока всего, мне не понять... По ссылкам тоже больно сложные лиспы, там даже ssget не используется. Мне нужно просто прочитать содержимое текста или атрибута. ssget возвращает <Selection set: 51> Что это? Ничего не ясно. Можно разжевать плиз? ![]() Как же все-таки извлечь содержимое из текста? (атрибут на время оставим) Добавлено 1. Предположим получил в результате работы некого кода (1 . "содержание_текста") что это? Список или нет? Как с этим работать, и оставить только искомое содержание? 2. Почему Из списка Цитата:
Может многоточие в конце означает что я просто не вижу всего, если это так, то как увидеть все содержимое в watch window
__________________
Блог Последний раз редактировалось Red Nova, 03.03.2009 в 23:01. |
||||
![]() |
|
||||
Проектировщик СС Регистрация: 24.06.2008
Минск
Сообщений: 134
![]() |
<Selection set: 51> - набор, применяя к нему (ssnamex) (см. справку) получаем некий список, из этого списка при помощи приведенных выше манипуляций (пост 595) получаем список ename объектов, которые выбрали функцией (ssget), применяя уже к этому списку (mapcar 'vlax-ename->vla-object) получаем список vla-объектов (объекты ActiveX), к которым можно обращаться при помощи функций c префиксом vla-. Описание всех объектов vla есть в хелпе (см. объектная модель).
#<VLA-OBJECT IAcadMText 0bdabf24> - это и есть vla объект. Открываем справку, ищем его свойства и методы, пишем (допустим он в переменной vla_obj): Код:
|
|||
![]() |
|
||||
Спасибо, но разве в посте #598 у меня не так? И не работает. А VVA говорит что
Цитата:
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
А скобки там для красоты, что ли?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Мда, ну тогда скажи как взять из списка (#<VLA-OBJECT IAcadMText 0bdabf24>) текстовое содержимое?
__________________
Блог Последний раз редактировалось Red Nova, 04.03.2009 в 09:04. |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
(vla-get-textstring (car lst))
Где lst - твой (#<VLA-OBJECT IAcadMText 0bdabf24>)
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
1. Если не уверен, что у тебя. Используй функцию type
Цитата:
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 04.03.2009 в 09:55. |
|||
![]() |
|
||||
Спасибо, с текстом таки понял. А вот атрибуты пока-что нет.
Предположил что так Цитата:
В отладчике показывает, что vla-getattributes возвращает *LAST-VALUE* = #<variant 8201 ...> Что это? На сколько я понял чтобы работала vla-get-TextString нужно подготовить что-то типа #<VLA-OBJECT IAcadMText 0cb388a4>, это наверное название объекта, но как его получить для атрибута не предполагаю.
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
А я не знаю что такое указатель и что с ним делать.
![]()
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
указатель - это нечто типа #<VLA-OBJECT IACADMTEXT 0BDABF24>
Только сам понимаешь, что текст и цифры будут другими
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
А что значит
Цитата:
_dwgru-block-get-attr-by-mask
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Список указателей на атрибуты. А потом применяешь нечто типа
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Указатель - ссылка на место в памяти, где есть нечто. В данном случае, визуально, это может быть представлено в виде #<VLA-OBJECT IACADMTEXT 0BDABF24>.
Тебе, чтобы не путаться, лучше термин указатель не применять. Для себя говори "получаю объект MTEXT". Это в конкретном случае, а в общем виде указатель может указывать на что угодно. |
|||
![]() |
|
||||
Ещё вопросик от чайника:
Как програмно написать верхний или нижний индекс в команде mtext? Когда мы просто хотим написать 2 в степени 2, мы пишем 2^2 выделяем ^2 и жмём stack. Как нажать stack програмно? И вообще какие есть способы програмного введения индексов? |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Eximius, С помощью управляющих кодов. Есть в справке Автокада.
Можно еще здесь посмотреть Твой пример в кодах выглядит так Цитата:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Елкалла палкалла, я опять не въехал.
Пожалуйста покажите на примере как получают значение атрибута блока.
__________________
Блог |
||||
![]() |
|
||||
Спасибо, правда эту ссылка я уже просматривал, и помню что так и не разобрался. Но вот поиском я нашел тему где Крыс впервые привел get-attr-by-mask, там я нашел и пример вызова
Код:
Код:
Такое возможно?
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Возможно. Используй nentsel
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Кулик Алексей aka kpblc,
Спасибо, теперь похоже нашел универсальный вариант для получения содержания текста или атрибута Код:
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
После nentsel'a проверяй тип возвращенного объекта. По-моему, в таком режиме это единственный вариант.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
1. А что такое режим?
2. Вот еще вопрос. Пишу код функции (функция-1) в которую вставляю другую функцию (функция-2), в функции-2 объявлена локальная переменная. Далее в функции-1 нужно вернуть значение локальной переменной функции-2, но в это время функция-2 свое уже отработала, и эта локальная переменная уже не существует. Очень не хочется трогать функцию-2 и менять локальную переменную на просто переменную, так как функция-2 применяется еще во многих местах. Выход есть?
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Если по-простому:
Код:
Теперь по п.2 - ищи информацию по областям видимости переменных. В качестве иллюстрации: Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
По П.2
Посмотрел в инете информацию по областям видимости переменных, ничего нового для себя не узнал, все те же локальные и глобальные переменные. Как вытащить из функции значение локальной переменной не узнал. А может такое вообще невозможно? Если на твоем примере, то мне нужно чтобы в функцие 1 значение переменной стало "func_2".
__________________
Блог Последний раз редактировалось Red Nova, 07.03.2009 в 10:20. |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Red Nova,
1. Присвой значение локальной переменной глобальной Код:
Код:
1. Глобальным может быть и список (если нужно вернуть несколько значенией) 2. Возвращаться может список (если нужно вернуть несколько значенией)
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Спасибо, значит таки придется чуток поменять твою SPECKG, поскольку мне нужно вернуть из нее список itog для таблицы ведомости расхода стали
__________________
Блог |
||||
![]() |
|
||||
Требуется создать цикл типа этого
Код:
Не могу определится со строкой с вопросами. Как выяснить нажал ли пользователь enter, и в зависимости от этого назначить “get_nil” nil ?
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Ф-ция get-text-string-by-ent в случае нажатия enter или выбора примитива, у которого нет свойства Textstring вернет nil
Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Спасибо. Теперь я подошел к самой сложной для меня части создания кода для ведомости расхода стали.
В результате описанных выше преобразований я могу получить к примеру такой список. Код:
Код:
Изделие-1 содержит только один вид изделия - Арматура АI Изделие-2 содержит два вида изделия - Арматура АI и Арматура АIII Изделие-1 содержит один вид изделия - Прокат ВСТ3КП2 Во первых нужно для каждого изделия проверить какие типы изделий есть в остальных изделиях и не хватают в нем, и добавить недостающие списки в его список. Затем спустится ниже уровнем и проверить наличие в других списках ГОСТов и вставить недостающие. Затем сделать тоже для каждого параметра изделия, а “вес” для них будет “0”. Думаю объяснение весьма хаотичное. Для большей ясности приведу пример того во что список должен преобразоваться. Код:
Добавлено Хотя нет. Представление о возможном пути решения похоже появилось, но на столько сложное, что может лучше бы эта идея ко мне не приходила. Поскольку важно учесть и очередность профилей, то нужно будет создать эталонный список, в котором будут все профили (а для каждого профиля все возможные толщины, диаметры или номера). Учитывая то, сколько одних только болтов dextron забил в prokat.ves, то эталонный список будет весьма длинный. Затем нужно создать пустой список СИП (список использованных профилей) Потом берем первый профиль эталонного списка и ищем нет ли такого профиля в исходном списке, если есть то добавляем в СИП этот профиль, потом просматриваем каждый диаметр для этого профиля, и находя хоть один, добавляем его в СИП, в результате для приведенного выше списка СИП получится такой Код:
Если других мыслей нету, то буду делать так. Возник вопрос. Требуется в зависимости от некого counter-а вернуть N-ный элемент списка, причем N = counter, как это сделать?
__________________
Блог Последний раз редактировалось Red Nova, 08.03.2009 в 21:24. |
||||
![]() |
|
||||
проектировщик CТБ Регистрация: 03.03.2009
Сообщений: 28
|
Привет вам с кисточкой от чайника) Есть задачка - вставить в чертеж уже существующий блок и присвоить его аттрибутиву некоторое число. Видела на форуме примеры программок, выполняющих подобное, но с применением LISP - объектно-ориентированного. Каким образом можно выполнить эту задачку, работая с блоками, как со списками?
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Aminka, а если по-русски? Работая с блоками, как со списками, но без программирования??
Red Nova, я так подозреваю, что тебе последняя задача нужна для заполнения таблицы, верно?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Red Nova,
Цитата:
Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
проектировщик CТБ Регистрация: 03.03.2009
Сообщений: 28
|
Кулик Алексей aka kpblcа если по-русски? Работая с блоками, как со списками, но без программирования??
без программирования я себе это с трудом представляю. Если я правильно понимаю, в автолиспе возможно работать тремя способами: 1. использованием функции command для создания и редактирования объектов 2.с помощью функций entmake и entmod, передавая в них списки со значениями dxf-кодов объектов. 3. с помощью AktivX. Меня интересует второй метод - каким образом вставить в чертеж блок, который уже присутствует в списке блоков данного чертежа, присвоив тестовому аттрибуту этого блока некоторое значение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
VVA,
Спасибо, то что надо. Кулик Алексей aka kpblc, Нет, нужно мне было это для сравнения двух списков, в недаконченном варианте это похоже на Код:
Код:
("A" "B") и ("A" . "B")
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Red Nova, если честно, то я давно уже потерял общую нить рассуждений и способен отвечать (в лучшем случае) только на последний вопрос. Если хочешь разобраться с кодом "сравнения двух списков", то можно приложить файл, откуда твой обрабатываемый список получен; код, которым ты его получаешь; и результат выполнения. Тогда можно было бы поковыряться (кстати, про версию када не забудь - это так, на всякий случай
![]() Лично я, например, вижу не самую оптимальную организацию списка как etalon, так и itog_izdelie_all. А отсюда и все остальное пляшет бог знает как.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
|||||
Цитата:
![]() Цитата:
Цитата:
Цитата:
__________________
Блог Последний раз редактировалось Red Nova, 12.03.2009 в 09:08. |
|||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
А чего, все архиваторы сразу сказали "ква"? Хором?
Кстати, в #629, думаешь, что-то более понятно, чем в #637? Лично мне - нет ![]() P.S. Разницу между списком и точечной парой я понимать понимаю, но объяснить не могу ![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Цитата:
Цитата:
Цитата:
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Ну вот, как пример:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
проектировщик CТБ Регистрация: 03.03.2009
Сообщений: 28
|
Привет еще раз. Есть код программки для рисования блоков с тексотвыми атрибутами, значения которых считывается из файла. Блоки уже определены в текущем чертеже. Однако, не могу справиться с двумя проблемами: 1. блоки вставляются посредством (command "insert"...), но тока вставки блока на чертеж после отработки программки не соответствует задаваемой в программе. 2. На чертеже не отображается текст.
Господа гуру, объянсите, пожалуйста, что не так и как это можно исправить? Сразу оговорюсь, что это мой первый опыт знакомства с автолиспом и в дебри объектного автолиспа еще не влезала. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Aminka, Непонятен принцип формирования схем и отсутсвует текстовый файлик, поэтому чтение из файла закоментировал, недостающие переменные проинициалировал, ошибки выделил
Код:
2. Не отключались привязки в INSERT ("_non") 3. Учти что INSERT вставляет блоки в точки ТЕКУЩЕЙ ПСК, а entmake создает полилинии и тексты в точках МСК. Короче если текущая система координат отлична от мировой будут проблемы.
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 13.03.2009 в 20:22. |
|||
![]() |
|
||||
Подскажите пожалуйста как добавить элемент в конец списка, а-то я нашел только cons, а им можно только в начало добавить. Или каждый раз нужно реверс списка делать туда-сюда?
__________________
Блог |
||||
![]() |
|
||||
Спасибо.
Не могу справится с одной задачкой. Имею список такого типа Код:
Требуется видоизменить последний элемент и добавить к нему элемент "Арматура d= 10" То есть в итоге должен получить. Код:
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Если структура списка известна заранее, то многократно вложенный subst тебе поможет. Вкупе с append
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
А можно на конкретном примере с #645?
__________________
Блог |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Я бы на твоем месте сильно призадумался насчет формта хранения данных, написать рекусривную (вызывающую саму-себя) функцию можно - но ихмо формат поменять более приваильно т.к. с неограниченной вложенностью ошибки будут лезть одна за другой, да и избыточность данных - неимоверная.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Дима_, я уже писал #636
![]() Red Nova, код получится практически нечитабельным (да и чертовски неустойчивым), если не применять рекурсию. Оно тебе надо?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Код:
То есть при запуске Код:
Код:
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
проектировщик CТБ Регистрация: 03.03.2009
Сообщений: 28
|
VVA спасибо, отключение привязок помогло)). Вопрос - почему при включенных привязках игнорируется точка вставки блока, напрямую задаваемая в INSERT и какая точка используется для вставки? я пробовала перед выполнением INSERT рисовать точку, но к ней блок не "привязывался".
|
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Aminka,
Цитата:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Спасибо за советы. Менять структуру хранения данных я буду только в самом тупиковом варианте. Просто уже многое сделано. Я ведь не все вам показываю.
Все таки по моему вы меня неверно поняли. В списке структура всегда одинаковая. Список может быть такой Код:
Код:
Так вот требуется Взять из этого списка последний подсписок, это Код:
Код:
Добавлено. Все, разобрался. Вчера меня заклинило, а сегодня получилось. Код:
list_sip это наш список, а (nth count_etalon_profil (car (cdr (car (cdr (nth count_etalon etalon)))))) И есть добавляемый элемент. Как всегда неуклюже, но работает ![]()
__________________
Блог Последний раз редактировалось Red Nova, 16.03.2009 в 23:59. |
||||
![]() |
|
||||
промышл проектант Регистрация: 26.05.2005
Изовсехщелей
Сообщений: 323
|
Подскажите кодом, пожалуйста
![]() есть некая программка с использванием немодального OpenDCL диалога - т.е. она всегда висит на экране. программно создаются примитивы - тут все ровно. Загвоздка на этапе объединения их в безымянную группу. ранее применялся код Код:
Код:
![]() Код:
Подскажите примерчик, пожалуйста |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Red Nova, Особо не проверял, но вроде работает
Код:
Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Diman111, попробуй найти код по очистке групп и сделай группировку некомандными методами (там на самом деле достаточно просто, насколько мне помнится)
P.S. С OpenDCL лично я не работал ![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Как вариант, написано "на коленке" с минимумом проверок:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Makswell, Через command вызываются стандартные команды, остальные как функции с префиксом C:
Пример: (C:VLIDE) (C:КАЛЬК)
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Регистрация: 12.07.2008
Сообщений: 211
|
Ребят, срочно надо, а времени изучать нет... подскажите, пожалуйста, как в лиспе извлечь выражение только если несколько условий выполняются. С помощью какой функции?
Мне, например, нужно подгрузить пользовательское меню только в том случае, если оно не подгружено (not (menugroup "Bla-bla")) и если cui-файл с заданным именем находится в путях поиска support files (findfile "Bla-bla.cui"). И еще попутный вопрос: сделал redefine сомманды _qsave так, чтоб сначала выполнялся сброс масштабов (-scalelistedit), а затем уже .qsave. Так вот, се работает прекрасно если чертеж не новый. Т.е. если создать новый чертеж и воспользоваться этой коммандой чтоб впервые его сохранить и присвоить ему имя, то чертеж не сохраняется, точнее переменная Filedia слетает в ноль и просит вручную прописать путь и имя файла. Что с этим делать, никто не знает?
__________________
Users are not stupid, they are busy. Последний раз редактировалось acyxou, 23.03.2009 в 16:40. |
|||
![]() |
|
||||
Инженер-строитель Регистрация: 15.08.2007
Киров
Сообщений: 2,204
|
Цитата:
Код:
|
|||
![]() |
|
||||
Наконец то на работе смягчился “каторжный режим” и есть чуток времени чтоб продолжить изучение лиспа. Продолжаю писать код для создания ведомости расхода стали при применении SPEC5D от VVA. Застрял на элементарном с первого взгляда вопросе.
Имею лист такого рода. Код:
Требуется убрать красные скобки, чтобы лист стал таким Код:
Ясно что нужно оперировать mapcar, но я не знаю как вернуть содержимое листа без скобок. То есть не знаю как имея это Код:
Код:
__________________
Блог Последний раз редактировалось Red Nova, 13.04.2009 в 00:16. |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Это так?
Код:
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Кулик Алексей aka kpblc, Спасибо, именно то.
__________________
Блог |
||||
![]() |
|
||||
Подскажите где взять информацию по тегам (как это правильно называется не знаю может и не теги) у примитива mtext.
Пример: создаю mtext не пргограмно с текстом ω в степени 3, далее (entget (entlast)) и вот что мне возвращается Код:
\\H0.7x;\\S - это как я понял тег для индексов, дробей и прочего, создаваемого кнопкой stack. Где взять полный список вот таких тегов (или не тегов)? Последний раз редактировалось Eximius, 25.04.2009 в 19:48. |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
http://forum.dwg.ru/showthread.php?t=12717
http://docs.autodesk.com/ACD/2010/EN...mber=d0e123454 В справке раньше (по моему в 2004) была прямо таблица. В 2008 быстро не нашел
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
Примерно так - для примитива: Код:
Код:
|
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
ShaggyDoc, большое спасибо за помощь. Тогда у меня вопрос конкретно по моему лиспу
Имеею: (фунцкцию error пока не задействовал) (defun c ![]() ;******* funktion error (defun *error*(msg) (princ msg) ;text bei error (if oldosm (setvar "OSMODE" oldosm)) ;if oldosm - zadano -> oldosm=oldosm (if oldalay (setvar "CLAYER" oldlay));if layer gewechselt -> zurück ); end of *error* ;*************** (initget 7) (setq pl_L (getreal "\nLänge: ")) ;get Länge (длина рамки) (initget 7) (setq pl_B (getreal "\nBreite: ")) ;get Breite (ширина рамки) (setq pl_1 (getpoint "\nInput Start Point: ")) (начальная точка) (setq pl_2 (list (+ (car pl_1) pl_L)(+ (cadr pl_1) pl_B))) ;upper right point (верхний правый угол) (setq pl_o (list (+ (car pl_1) 10.0)(+ (cadr pl_1) 10.0))) ;lower left point für offset (точка для оффсета) (setq pl_rahmen (ssadd)) ; задание пустого набора (command "_.rectangle" pl_1 pl_2 "") ; вырисовка прямоугольной рамки (ssadd (entlast) pl_rahmen) ; добавление рамки в набор (command "_.chprop" "_last" "" "_layer" "SF-RAHMEN" "_c" "_bylayer" "") ; смена цвета и уровня (command "_.offset" "-t" pl_rahmen pl_o "_e") ; а вот здесь засада - никак не дойду как ![]() (princ) );end defun пробовал также так: (command "_offset" "10" pl_rahmen "1" ""), но как указать направление? С уважением, Александр |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
alex8888, ну зачем так-то, "молекулы на атомы" разлагать, а потом снова их синтезировать:
(setq pl_2 (list (+ (car pl_1) pl_L)(+ (cadr pl_1) pl_B))) Используй функцию polar, и все проблемы пропадут, например Код:
|
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
alex8888,
1. Не обрабатываешь привязку (грабли №1) 2. В команде _rectangle лишняя "" 3. Нет необходимости создавать набор 4. Команде OFFSET нужно передавать список такой же, какой возвращает (entsel), т.е. (имя_примитива точка_выбора) 5. Середина диагонали прямоугольника всегда лежит внутри этого прямоугольника ![]() Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
ShaggyDoc,
я пытался использовать _.pline, но без polar (что то его не совсем понял), бывает путаюсь в углах. И вот там нужно сперва каждую точку высчитать, а _rectangle только двумя, вот бес и попутал ее взять. А чем плоха команда _rectangle для программистов? И можно ли использовать команды из механикла (типа AMRECT.... тыры-пыры)? 2. Отключение объектных привязок - сохранение-сбрасывание в 0 и восстановление "osmode" достаточно? Или еще какая переменная важна? Участок кода отрисовки, так? (setq pl_1 (getpoint "\nInput Start Point: ")) (setq pl_2 (polar pl_1 0 pl_L)) (setq pl_3 (polar pl_2 (/ pi 2) pl_B)) (setq pl_4 (polar pl_3 pi pl_L)) (command "_.pline" pl_1 pl_2 pl_3 pl_4 "_c" "") VVA, спасибо. Именно про синтаксис offset я и пытался выяснить. Тяжело изучать Lisp работая в немецкой версии Autocad Mechanical (2009-2010), книжки на русском, помощь по лиспу на английском, команды все тоже надо с немецкого переводить. В справке ничего нет, там только типа выбрать мышкой и ткнуть туда то. Все опции приходится искать методом тыка. Что касается отступа для offset, то я его попытался прописать так: (setq pl_o (polar pl_1 (/ pi 4) (* 10 (sqrt 2.0)))) (vl-cmdf "_.offset" 10 pl_rahmen pl_o "") Как ни странно, сработало. Может з переляху? Последний раз редактировалось alex8888, 27.04.2009 в 16:22. Причина: дополнение |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
alex8888, polar одна из самых необходимых функций. Синтаксис простой:
(polar известная_точка угол_в_радианах расстояние) Возвращает точку, расположенную на расстояние от известная_точка по направлению угол_в_радианах. RECTANG - это команда-обертка (так же как и POLYGON, DONUT). Она создает полилинию, причем опции этой команды уже менялись неоднократно. Используя RECTANG можешь рисовать только прямоугольник, и только в ПСК. Это частные случаи. А может быть и "кривоугольник" и различные контуры. И под разными углами поворота. Учиться надо сразу правильно. Даже для прямоугольника координаты всех точек через polar высчитать проще, чем одной противоположной точки добавлением ординат. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
ShaggyDoc,
спасибо за ответ. 1. Ну а с механикловскими командами (начинаются с AM...) имеет смысл программировать? Или там тоже такие же "обертки"? 2. Можно ли при вводе запрашиваемого числа ввести буквенный символ, чтобы произошло ветвление программы, типа если вместо числа пользователь нажал "S" (например), то программа запросила бы ввести дополнительное число? Примерно так: (initget 1 "S") (setq p1 (getpoint "\nВведите точку или [Stuffe]:")) (if (= p1 "S") (setq p2 (getpoint "\nВведите точку 2")) ); end if ;далее тело основной функции |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
1. Сугубо ИМХО: команды вертикальных решений дрессировке поддаются весьма слабо.
2. См. ключи initget (конкретнее - биты).
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
alex8888, вряд ли стоит связываться с вертикальными решениями. Там многое зависит от того, как "оформлена" команда. Там ведь не только свои дополнительные команды, но и свои объекты, отсутствующие в AutoCAD создаются.
Если у этой системы есть документированный интерфейс для программирования, тогда можно попробовать. Однако не изучив общих азов это заведомо бесполезно. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
ShaggyDoc, Кулик Алексей aka kpblc,
спасибо за объяснение. В целом же чистый астокад и механикал сильно отличаются в плане программирования? Например, программы из ветки http://forum.dwg.ru/showthread.php?t=5887&page=4 по отрисовке объемных тел ни одна не пошла. Ошибки пишет разные. В основном, не нравятся какие-нибудь команды, например, _.view. Если введу _.-view, то проходит выполнение дальше, но при этом требует ввода локализованных параметров, английские берет, но определять их вслепую надо (подсказки нет). Как можно "заставить" lisp-программу выполнить команду, записанную в другом лисп-файле? Не хочу изобретать велосипед, если есть возможность воспользоваться уже готовыми библиотеками из Ру-када, да и самому тоже хотелось бы немного пооптимизировать и не набирать в каждой программе один и тот же текст. Мысль подгружать их все при загрузке автокада не проходит - в Ру-каде слишком много функций, да и не известно на 100%, что понадобится. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
По стандартным командам: вообще-то они все должны работать. По "заставить выполнить другой lisp" - а что там сложного? Загрузить оба лиспа, и в первом вызывать функцию, определенную во втором. Ничего сложного...
P.S. Эта технология в книге "САПР на базе..." описана очень подробно, насколько я помню. P.P.S. Сейчас уже всерьез задумываюсь о написании лиспа, который будет выдавать всю "подноготную" какой-либо lisp-функции...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Цитата:
![]() Цитата:
![]() Цитата:
Прошу прощения за назойливость ![]() |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Способ есть. В "Готовых программах" посмотри - там был вариант загрузки всех приложений из указанного каталога.
P.S. Насчет "подноготной"... Тот вариант, который я задумал, недостаточно универсальный - некоторые ограничения накладываются (в частности, к именам функций, которые надо отслеживать).
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Цитата:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Кулик Алексей aka kpblc, ShaggyDoc,
вот наваял: (defun c ![]() ;************funktion error******************** (defun *error*(msg) (princ msg) ;text bei error (if oldosm (setvar "OSMODE" oldosm)) ;if oldosm - zadano -> oldosm=oldosm (if oldlay (setvar "CLAYER" oldlay)) ;if layer gewechselt -> zurьck ); end of *error* ;*****************Parametry privjazki******************** (setq oldosm (getvar "osmode")) (setvar "osmode" 0) (setq oldlay (getvar "clayer")) ;*****************Input Znachenij*********************** (vl-load-com) ; Не знаю - надо ли? далее будет команда vl-cmdf (initget 7) (setq pl_L (getreal "\nLдnge: ")) ;get Lдnge (initget 7) (setq pl_B (getreal "\nBreite: ")) ;get Breite (setq pl_1 (getpoint "\nInput Start Point: ")) ;lower left point ;****************Raschet******************************** (setq pl_2 (polar pl_1 0 pl_L)) ;lower right point (setq pl_3 (polar pl_2 (/ pi 2.0) pl_B)) ;upper right point (setq pl_4 (polar pl_3 pi pl_L)) ;upper left point (setq pl_o (polar pl_1 (/ pi 4.0) (* 10.0 (sqrt 2.0)))) ;point fьr offset ;****************Ramen********************************** (command "_.pline" pl_1 pl_2 pl_3 pl_4 "_c" "") ;draw rectangle (setq pl_rahmen (entlast)) ;save rectangle ;****************Postroenie offset********************** Как сделать, чтобы при отсутствии layer "SF-RAHMEN" он был бы создан? (command "_.chprop" "_last" "" "_layer" "SF-RAHMEN" "_c" "_bylayer" "");change layer+color (vl-cmdf "_.offset" 10 pl_rahmen pl_o "") ;offset ;***************Bemassung***************************** (setq pl_h (list (+ (car pl_4) (/ pl_L 2.0))(+ (cadr pl_4) 40))) (setq pl_v (list (- (car pl_1) 40)(+ (cadr pl_1)(/ pl_B 2.0)))) (vl-cmdf "_.layer" "_s" "AM_5" "") (command "_.dimlinear" pl_4 pl_3 pl_h) (command "_.dimlinear" pl_1 pl_4 pl_v) (princ) ;**************Zurьck peremennye*********************** (setvar "osmode" oldosm) (setvar "clayer" oldlay) );end defun VVA , а основной язык (немецкий) у меня не накроется? Ведь только связка русский-английский или немецкий-английский работают. Поддержка русского у меня стоит, но для юникода первым идет немецкий, если ставлю русский - все умляуты (д,ц,ь,Я) пропадают. Если только для меня, то особо не напрягает, а вот если для документации? Последний раз редактировалось alex8888, 29.04.2009 в 11:42. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
[quote=alex8888;389383],
Когда публикуешь код, ставь птичку "Отключить смайлы в тексте" в "Дополнительных опциях" Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Как создать именованную систему координат, если в текущем файле рисунка вообще нет таких систем координат?
Желательно через функцию entmakex. Какие (по минимуму) dxf коды нужны для создания именованной ucs? Как получить координаты текущей системы координат относительно мировой? |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Цитата:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
VVA,
спасибо, понял. Насчет кодовых страниц вопрос пока открытый (У меня виста 64х бизнес немецкая). Кулик Алексей aka kpblc, Цитата:
![]() |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
alex8888, Ну так экспортировать сущестующие значения реестра, импортировать и посмотреть, если что вернуть назад.
По идее в этой части Цитата:
Цитата:
DwgRuLispLib: Команда. Загрузка lisp файлов из указанной папки
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Offtop: VVA, вот и тебя "размножили"
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Цитата:
![]() VVA, попробовал поменять кодовые страницы - результат: ![]() 1. исчезли все умляуты, вместо них русские буквы; 2. в автокаде как были иероглифы и знаки вопроса, так и остались. То есть, системные установки кодовых страниц еа автокад не влияют. Где то спрятано глубже. Последний раз редактировалось alex8888, 30.04.2009 в 14:37. |
|||
![]() |
|
||||
VVA, спасибо что отвечаете на все вопросы которые я тут задал.
И ещё чуть-чуть: У Кулик'a Алексея aka kpblca, в видео vlideworks он в теле функции defun создаёт ещё одну функцию типа defun. Из видео мне не понятно зачем, и как она будет работать. В каких случаях удобно создавать такие: Код:
|
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Ну это локальные функции. Особенно удобно, если надо переопределять обработчик ошибок именно внутри какой-то своей функции. Ну или рекурсию, например, применить...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер Регистрация: 11.12.2007
Москва
Сообщений: 295
|
Взялся за Лисп. Читаю эту тему с начала. Если кого не затруднит, назовите посты или ссылки на описание функций на русском языке. Или быть может есть в Автолисп справка как родная но на русском?
п.с. понимаю что вопросы уже тут шумевшие не раз. Если что удалите мой пост, но получив в личку ответ был бы признателен. ![]()
__________________
Live as though tomorrow you will die, Study as though you will live eternally. |
|||
![]() |
|
||||
Цитата:
http://aco.ifmo.ru/~nadinet/html/oth...book/lisp.html А вообще пользуюсь книжкой Полещука и Лоскутова AutoLISP и VisualLISP в среде AutoCAD ![]() У меня вопрос к опытным людям по функции initget: ... (initget "Yes No") (setq antw (getkword "\nContinue?[Yes/No]:<Yes>")) ... Выглядит это как показано на первой картинке. А хотелось бы, чтоб было похоже на вызов стандартной функции, как на второй картинке. Есть какие-нибудь параметры initget, чтобы варианты не выскакивали сразу, а их можно было высветить, если стрелочку "вниз" нажать. Мелочь кнешна, но вот такая тонкость интересует ![]() |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Do$, getkword не запрашивает точки, соответственно нет координат. Сравни:
Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Помимо этого, еще и биты для initget не помешают
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Супер!
![]() В той программе, из которой этот фрагмент, в этом месте точку указывать не надо. Там смысл именно в том, что либо "да" либо "нет" или же пустой ввод, что равносильно "да" - Пользователь выбирает пару объектов, затем выскакивает этот запрос: выбрать еще пару или выход? Если "да" или пустой ввод - то цикл повторяется, пользователь выбирает еще пару объектов. Дело только в том, что таких пар может быть больше сотни, и рука отвалится на "enter" жать каждый раз... Наверное, лучше тогда перед выбором первого объекта из пары сделать запрос такого вида: ... (initget "Exit") (setq text1 (entsel "\nSelect first object or Exit?[Exit]:<Exit>")) ... Там правда не entsel а ssget используется... Код на работе, к сожалению. Буду пробовать, спасибо VVA! Насчет битов, чтоб с ошибками не вылетало при неправильном вводе... Запретить пустой ввод, и ... все? |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Сейчас кад не запустить, но можно попробовать (initget 169 "Да Нет Yes No _ Y N Y N") перед getpoint.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
проектировщик CТБ Регистрация: 03.03.2009
Сообщений: 28
|
День добрый!
Подскажите, пожалуйста, как лучше реализовать следуюющее: Есть программка на автолиспе, в которой выполняется цикл. Необходимо написать прерывание цикла по некоторой клавише или комбинации клавиш, при этом программа на автолиспе должна продолжить свою работу дальше. Правильно ли я понимаю, что нужно писать макрокоманду для "привязки" некоторого действия к комбинации клавиш, причем писать макрокоманду нужно внутри той же программы? И еще вопрос: во многих языках программмирования имеется возможность устанавливать "метки" на строчки и при необходимости перейти к необходимой строчке, которую пометили, из любой точки программы. Есть ли такая возможность в автолисп? Поскольку с автолиспом я на "Вы", буду благодарна за простые и понятные новичку ссылки по теме) Если не очень хорошо объяснила, что нужно, то вот: (начало программы() (начало функции "клавиша"() (если нажаты клавиши "ST" (setq условие2 nil)) ) (while (условие1) (программа что-то делает в цикле 1) (setq условие2 T) (while (условие2) (программа что-то делает в цикле 2) ) ) ) Т.е. если в процессе выполнения цикла2 будут нажаты клавишы ST, произойдет выход из цикла. |
|||
![]() |
|
||||
Насчет меток: тоже озадачился этим вопросом, когда начинал изучение ЛИСПа. В фортране: goto <метка> и переход на нужную строку. Тут такого нет, поэтому программы по другому приходится выстраивать. Честно говоря, особых сложностей из-за отсутствия такого оператора безусловного перехода не возникало.
Насчет цикла : делал похожую программу, выкрутиться можно так - в процессе выполнения цикла 2 выводится запрос: введите "Да" или "Нет" (к примеру). Если "Да" - условию 2 присваивается Т, если Нет - присваивается nil и цикл завершается. |
||||
![]() |
|
||||
проектировщик CТБ Регистрация: 03.03.2009
Сообщений: 28
|
Этот вариант применять бы не хотелось изначально, потому что нажимать триста раз ентер в цикле - монтонно слишком и времени займет много.
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
vovkam, мой AutoCAD 2008 не знает функции sqr, это раз. Второе: где и что конкретно не работает?
Aminka, а что конкретно хочется сделать-то? Полный код кусков "что-то делать" покажи.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
E-degtyarev, vovkam говорит, что во втором случае код работает. А sqr там используется. Значит, она уже определена и загружена.
--- Добавлено: методика записи Код:
Короче, код написан "не для лиспа" ![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
vovkam, с тебя значение переменной g:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 16.01.2009
Сообщений: 15
|
Добрый день (или вечер) уважаемые корифеи Лиспа!
Я еще только как месяц пробую освоить программирование на Лиспе. Маленькие программки вроде как освоил и тут замахнуться (дурень думками богат?) на расчет эвакуации людей из здания. Может это уже кто и без меня придумал, но я об этом пока не знаю. Задумка была такова чтобы можно было нарисовать пути эвакуации людей на чертеже, ввести количество людей в чертёж и в таблице получить все результаты вычислений, и в конце время эвакуации из здания. Это была такая задумка, а сталкнулся я с проблемой, когда пытался ввести длину участка маршрута в таблицу, для дальнейших вычислений. Длину участка изображенного до этого графически я так и не смог вычислить и ещё не смог научиться определять длины различных участков одного маршрута. Пока что дальше не пошел. Если кто может подсказать, каким образом можно информацию о длине линий из чертежа вставить в таблицу Автокада (или экселя) , для использования в вычислениях, то очень буду тому благодарен. И вообще возможно ли это в Лиспе? |
|||
![]() |
|
||||
проектировщик CТБ Регистрация: 03.03.2009
Сообщений: 28
|
Цитата:
Код:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
не вникая в код (поздновато уже):
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Цитата:
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
По идее надо:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
проектировщик CТБ Регистрация: 03.03.2009
Сообщений: 28
|
Cпасибо. В приложении - итог моей "деятельности", который, однако ж, глючит слегка, судя по лишней надписи nil и ""-пустому вводу в окне командных строк. ![]() Не уверена, что мое "творчесство" кому-то интересно, но, может, и пригодится - программка позволяет осуществлять нумерацию датчиков ПС,а так же вывод в файлик информации по датчикам и длине кабеля между ними, отрисованного полилинией. Если будут идеи по тому, как сделать правильнее и красивее, буду благодарна)))) И еще вопрос - крайне не оригинальный, но что ж поделать - можно ли рисовать автокадовские таблицы с помощью автолиспа, но без использований объектных vla-.. функций? Хотелось бы информацию из файлика вывести в таблицу в автокаде, которая нормальная таблица, а не набор линий и текста) |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
"Навскидку". Замени (setq gr (ssget)) на (setq gr (ssget '((0 . "INSERT")))) - и будут выбираться только блоки. А если добавить сюда и имена блоков, станет совсем просто:
Код:
Код:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Цитата:
Код:
(A1 B C1 C2 C3 DL DLINA DOPNUM FILEH FL1 FL2 FLAG_SEL_NEW FNAME GR J K N NB OBPLAM P PKP POLYL POM ROT SS SUM TEMP X XX XXX XXXX) Эти переменные используются в каких то других функциях? Если нет - то их тоже правильнее внести в список... А может быть от многих из них постараться избавиться, переделав код... Код:
Код:
![]() (gc) Что делает? Зачем тут нужна? (Может действительно нужна, просто я с ней "не знаком") (princ) после закрывающей функцию скобки не будет обрабатываться Код:
|
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Во времена 10 Автокада это было критично.
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
проектировщик CТБ Регистрация: 03.03.2009
Сообщений: 28
|
Относительно (gc). Без нее строка (setq dlina (+ dlina (getvar "PERIMETER"))) работать адекватно отказывалась. На попытку вытащить то. что лежит в "PERIMETER" акад ругался, хотя и писал в командном окне значения area и периметра. Почему, не имею понятия( После того, как не получилось кусок кода с подсчетом длины полилинии написать самой, подсмотрела ее в одной из готовых программ. Видимо, в свойстве "PERIMETER" что-то уже валялось..хотя это лишь мои догадки) Ну а в конце я ее решила добавить уже почитав, что она память подчищает.
Избавиться от лишних переменных можно. Просто написала кучу всяких разных переменных для наглядности и упрощения отладки, на четверть их сократить точно можно)) Что и обещаюсь сделать в ближайшее время. Но вопрос с рисованием таблиц остается открытым. Если не будет лениво и у кого-то есть пример того, как вставлять таблицы без функций вида (Vl*-... ), киньте сюда, плз, буду разбираться на примере методом тыка и хэлпов. Если так не получится вставить табличку, то хоть напишите об этом))) Буду покупать тогда полищука и пытаться изучать (vl*). Если я правильно понимаю, то искать нужно то, как работает VLA-ADDTABLE? Опять-таки, вопрос человека, весьма далекого от программирования, vl-функции, это ведь уже объектно-ориентированное программирование под автокад? В инете множество ссылок на VBA. Однако с автолиспом, работающим со списками, у них маловато общего. Стоит ли начинать лезть в VBA или хватит вполне Полищука?)) В общеМ, извиняйте блондинку за кучу вопросов дурацких, но инфы в инете слишком много и у меня глаза разбегаются и за что хвататься не очень понятно. Последний раз редактировалось Aminka, 28.07.2009 в 18:44. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Offtop: полищука покупать не надо. А вот книгу Н.Н.Полещука - можно и нужно
![]() Теперь по делу (возможно, VVA меня поправит): создавать таблицу "просто так" не получится. Сначала надо создать или изменить стиль таблицы. Учитывая объем информации, хранимой в описании табличного стиля, я бы упирал именно на ActiveX-методы. Вставку таблицы и задание ей всех настроек (количество и ширина столбцов, высоты строк, границы ячеек, объединение ячеек и т.д.) - я бы тоже делал на ActiveX (то есть vla-* функциях).
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Нечего и нечем поправлять
![]() Добавлю только, что как вариант можно создавать стиль таблицы так: 1. настроить ручками 2. Сохранить полученный список из словаря "ACAD_TABLESTYLE" 3. При необходимость entmakex' ом создавать. Так было сделано здесь (см. table-style-make из #1) Кстати, чтобы при активной работе с таблицами чтобы она не подтормаживала, не забывать включать/отключать свойство Regeneratetablesuppressed с его проверкой. Подробнее можно почитать здесь
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Do$, Ты ссылку в #724 читал?
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Да, там описание в википедии про сборщик мусора в различных языках программирования.
Он удаляет ненужные данные, освобождает память. Сперва я подумал, что после завершения работы программы ставим gc и всем неиспользуемым переменным nil присваевается. Попробовал - ничего подобного... Пока писал ответ, пришла мысль: когда мы вводим новую переменную, в памяти выделяется какое-то место под нее. Даже если мы потом этой переменной nil присвоили, место под нее сохраняется. А gc подчищает как раз такие неиспользуемые зарезервированные участки памяти. Но это только мои фантазии ![]() Последний раз редактировалось Do$, 29.07.2009 в 15:49. Причина: Неточно мысль выразил |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Ну в общем где-то так и есть.
Код:
Каждое присвоение в a требует разного объема памяти. Подчисткой таких хвостов как раз gc и занимается.
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
А какие-то критерии использования есть? Например - провел цикл присвоения одной и той же переменной разных значений - запускаем "мусорщика". У Полещука как то неопределенно описано применение, цитата: "когда работают большие приложения...". А как определить, большое приложение или нет?
А имеет ли смысл при нынешних объемах памяти вообще эту функцию использовать? |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Do$, Мусорщик запускается автоматически. Самому вызывать не нужно. Я последний раз принудительно вызывал его в году эдак 1991-1993, когда был DOS (твой тезка
![]()
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
В современных AutoCAD сборщик мусора вызывать не обязательно. Памяти обычно хватает. Но у меня он включен в стартовую функцию, которая вызвается во всех программах. Тем самым постоянно убирается грязь.
"Большие приложения" действительно расплывчатое понятие. Оно не связано с большим объемом кода. Иногда маленький "в строках", но плохо написанный код может привести к накоплению мусора. Вот здесь вызов (gc) поможет. Хотя лучше писать хороший код. Более точно о gc знают только програмисты Autodesk, реализующие сборку мусора в AutoCAD. А вот в AutoCAD-10 вызов (gc) был абсолютно необходим в любой чуть сложной программе. В отличие от Windows, где, в крайнем случае, добавится дисковая память, в DOS это было невозможно. Весь LISP работал в 64 Kb памяти, из них около 20 Kb занимал сам интерпретатор, а остальное делилось между пространством нодов и пространством строк. В пространстве нодов и размещаются переменные и их значения. При исчерпании этого пространства выполнялась автоматическая сборка мусора. Только она могла не успеть выполниться. Сейчас, видимо, происходит что-то подобное, просто память измеряется уже другими единицами. И еще использовалась ныне забытая функция vmon, выполнявшая постраничную организацию памяти, в случае если LISP-программа превышала имеющееся пространство нодов. Серьезные программы без vmon и gc нельзя было написать. А теперь - можно. Если, конечно, аккуратно обращаться с переменными. |
|||
![]() |
|
||||
Хотелось бы добавить, каждый вызов сборщика мусора занимает время, причем, не всегда хватает одного прохода, т.е. при троекратном вызове, результат может быть лучше, но занять в трое больше времени. Я тоже регулярно вызываю сборщик мусора, после создания и обнуления большого количества объектов или работы с огромными списками. Из своего опыта могу посоветовать, обратить внимание на несколько моментов:
1. Всегда планировать в какой момент вызвать сборщик мусора. Иногда выгоднее его вызвать несколько раз по ходу программы, а иногда один раз в конце или старте. Мой критерий - замеры скорости работы на реальных (больших) чертежах. 2. Заранее проверять, есть ли изменение в расходе памяти, если вызвать сборку мусора два три раза подряд. 3. Винда, не любит освобождать память сразу. Часто приходится ждать некоторое время. Хорошо помогает вложенный вызов. Как пример, сильно расходует память программа с вызовом Код:
Код:
Код:
ps. Наблюдения проводились в программах, занимающих во время выполнения несколько сотен мегов в оперативке. Вероятно, для маленьких задач, вызов сборщика мусора не актуален. Автокад, сам его регулярно вызывает. Другое дело, если лисп выполняется значительное время, например час или часы...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
Давненько я тут не был
![]() ЛИСП я так и не выучил, да и что знал – позабыл. Но причины на этот раз не в лени как у меня обычно бывало. Я трудился над развитием лиспа от VVA для расчета спецификаций из мтекстов SPEC5D, намеревался добавить функцию автоматической генерации ведомости расхода стали и даже немного получалось, но как это часто бывает: работа... Приехал к нам в страну новый сотовый оператор. Меня назначили ГИП-ом, и про мое увлечение пришлось забыть на год, да и навряд ли теперь удастся вернуться к этому… Но недавно работа поостыла и я для начала решил обновить Акад и СПДС. Поставил 2010 + СПДС6. Теперь тестирую все что имел под 2009-й. И обнаружил что так прижившаяся в моем КБ добавка для генерации ведомости из выносок СПДС перестала работать. Потестил в Влайде, понял что глючит dwgru-get-spds-text-and-range представленный Кулик Алексей aka kpblc тут на посте 472. Списки в 2010-ом создаются некорректно ![]() Поможите люди добрые
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
6-го СПДС нет, так что я помочь не смогу. Может быть, "штатные" средства самой СПДС помогут (но не факт)
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
А идей нет?
2009 + СПДС4 Цитата:
Цитата:
![]()
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Цитаты помогут как мертвому припарки. Надо скачивать и ставить СПДС 6, а у меня сейчас скорость коннекта около 5 кбит/с.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Просто на сколько я помню ты первую версию вовсе без СПДС-а написал
![]() Жаль что скачать не можешь. Отправил бы по почте в конверте, да наверное доходить долго будет, хотя идея... ![]() теперь мне наверное предется на некоторое времяпреостановить использование 2010-го пока не сохранил важные файлы в 6-й версие СПДС, а-то потом не 4-м не открою если что... У кого из программистов есть СПДС 6? HELP
__________________
Блог |
||||
![]() |
|
||||
VVA,
2009 Цитата:
Цитата:
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
"Насухую", предполагая, что СПДС 6 только в 2010:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Спасибо, заработало
![]() А возможно сделать так чтобы для обоих версий СПДС одна и та же функция была рабочей? Скажем сперва проверить версию СПДС потом в зависимости от нее то либо другое.
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Если бы мне удалось это сделать, то все было бы наверняка проще. Значительно проще.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Кулик Алексей aka kpblc, В порядке бреда : после entget'a subst'ом и заменить (301 . "String1") на (301 . "Первая строка") и не привязываться к версии Автокада
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Можно и так
![]() ![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
Но программа принципиально неверно делается. 1. Надо делать разрыв не только "линий" (программисты говорят и пишут "LINE", в крайнем случае "отрезок"), а и других типов примитивов, похожих на "линии". У них точки совсем иначе извлекаются. 2. Разрывать надо одну "линию", та, которая должна лежать ниже. Для этого надо указать не точку пересечения, а примитивы - тот, который надо разорвать и тот, которым надо разорвать. Указывать надо в любом месте, пересечений может оказаться несколько. При этом ещё учитывать, что примитивы (полилинии) могут иметь физическую ширину. В результате реальная программа вырастет в размере примерно да двухсот строк, и это если использовать библиотеки. Такую программу я включал в исходники к книге "САПР на базе AutoCAD - как это делается" - ru_cross_lines.lsp. |
|||
![]() |
|
||||
Регистрация: 15.01.2010
Сообщений: 254
|
Цитата:
Цитата:
![]() Мне просто надо пересекающиеся ОТРЕЗКИ разрывать, а тут уже предлагаете целый комбайн использовать... Цитата:
![]() |
|||
![]() |
|
||||
Оказывается заработала теперь только с spdsnoteposition, а остальные выноски в пролете...
"spdsNoteKnot" "spdsNoteComb" "spdsNoteChain" Пожогите пожалуйста и для них исправить функцию _dwgru-get-spds-text-and-range. Вот что выдает тестирование этих объектов СПДС функцией от VVA поочередно в 2010 Код:
Код:
__________________
Блог |
||||
![]() |
|
||||
Не у кого пока нет идей...
![]()
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Без привязки к версии Автокада. Данные меняются по словарю. Для замены списка добавлена функция _dwgru-prepare-spds-list.
Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Инженер Регистрация: 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-тыры-пыры есть команда на скругление? Не могу найти пока никак. |
|||
![]() |
|
||||
В команду fillet нужно передавать не точки, а примитивы. Точно не скажу, в каком виде, но либо в таком, как их возвращает функция entsel, либо просто ename - (car (entsel)).
Цитата:
|
||||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Цитата:
|
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
Неужели трудно промоделировать все варианты запросов и ответов в командной строке? |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Цитата:
Цитата:
Цитата:
Во вложении весь текст программки, может быть копаться в другую сторону? |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
|
|||
![]() |
|
||||
Хм, вот ведь странность - fillet ведет себя по разному, если вручную выполнять и через vl-cmdf. После указания радиуса, команда прекращается.
Поэтому, думается мне, надо либо два раза запускать vl-cmdf (vl-cmdf "_.fillet" "_r" f_r) (vl-cmdf "_.fillet" f_1 f_2) Либо для задания радиуса менять системную переменную filletrad. Цитата:
Код:
Последний раз редактировалось Do$, 25.02.2010 в 13:42. |
||||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Добавил строку :
(setvar "filletrad" f_r), и изменил: (vl-cmdf "_.fillet" f_1 f_2) Все работает. ![]() Теперь вопрос как получить скругление 2х соседних углов , если радиус скругления равен половине длины общей стороны? Первый угол скругляется правильно, второй уже нет. Если нужно закруглить только противоположные углы, то все проходит нормально. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Цитата:
![]() Так я за один проход убиваю всех зайцев - тут тебе и контур какой надо, и ничего объединять не нужно, в смысле отрезки-дуги и тп. Решил задачу проще - взял точки не посередине скругляемой стороны, а ближе к углу - все работает как надо. Только точек добавилось ![]() : f_9 (polar f_1 0 (* 0.25 f_l)) ;9+10 - rechts unten f_10 (polar f_2 (* pi -0.5) (* 0.25 f_h)) f_11 (polar f_2 (* pi 0.5) (* 0.25 f_h)) ;11+12 - rechts oben f_12 (polar f_3 0 (* 0.25 f_l)) f_13 (polar f_3 pi (* 0.25 f_l)) ;13+14 - links oben f_14 (polar f_4 (* pi 0.5) (* 0.25 f_h)) f_15 (polar f_4 (* pi -0.5) (* 0.25 f_h)) ;15+16 - links unten f_16 (polar f_1 pi (* 0.25 f_l)) (vl-cmdf "_fillet" f_9 f_10) ;rechts unten Ecke (vl-cmdf "_fillet" f_11 f_12) ;rechts oben Ecke (vl-cmdf "_fillet" f_13 f_14) ;links oben Ecke (vl-cmdf "_fillet" f_15 f_16) ;links unten Ecke Последний раз редактировалось alex8888, 25.02.2010 в 16:35. Причина: дополнение |
|||
![]() |
|
||||
VVA
Спасибо за код, пока правда так и не проверил, все занят покупкой новой машини ![]() ![]()
__________________
Блог |
||||
![]() |
|
||||
alex8888, не ищете вы легких путей...
В вашем случае надо отрисовывать полилинией прямоугольник со скругленными углами: простой арифметикой можно определить точки и создать полилинию функцией entmake или entmakex. |
||||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Do$,
а нельзя наводку, как именно через enmake-entmakex и чем же легче? Посмотрел описание - немного вспотел ![]() ![]() Поначалу я делал так: рассчитывал каждую точку, потом по ним рисовал замкнутую полилинию. Но была трудность, что как то коряво рисовались дуги после прямых линий (конструкция типа (vl-cmdf "_pline" p1 "_l" p2 "_a" "_center" p3 p4 "_l" p5 ..... "_close"). Так вот некоторые дуги почему то рисовались развернутыми в обратную сторону (не наружу, а внутрь)). Поэтому я и решил посмотреть на _fillet. Может есть более простое решение? |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
Для этого достаточно просто вручную промоделировать ситуацию - рисовать последовательно со всеми опциями, вводя их в командной строке. Точки можно указывать примерно - сразу будет видно, куда выгибается дуга. Командный метод - самое простое решение. Сначала надо им научиться делать, пройти через детские ошибки №1 и №2. Можно и через entmake, и через ActiveX, но там уж вовсе больше изучать надо. |
|||
![]() |
|
||||
Цитата:
Вот копия из ком строки: Код:
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
ShaggyDoc
Цитата:
2.При проходе вручную функции _pline тем же порядком, что и в программе, контур получается правильным, а из программы нет. Почему? Из-за скорости проведения линии вручную? Цитата:
![]() Про привязки уже уяснил, хотя не попадал в такие ситуации, где они бы помешали. Еще открытым для меня остается вопрос, как подгрузить вспомогательную пользовательскую функцию из другой пользовательской, типа ru-трам-пам-пам из _ru-тра-ля-ля? Когда вписываю несколько функций в один Lisp, то команда из функции работает, равно как и если была прописана вспомогательная функция в автозагрузке через appload. Но все функции без надобности грузить в каждый чертеж? ![]() Do$, 1. По твоему коду получается проще? И что мне теперь для каждого из 16 вариантов делать свою полилинию через entmakex? В чем выигрыш? 2. Зачем делать преобразования систем координат? Я только, как понимаю, всегда в МСК работаю. Елпанов Евгений Цитата:
2. Использование вертикальных решений мне еще в начале программирской деятельности рекомендовали не использовать. 3. Данная прога только прелюдия для более масштабного проекта, так сказать учусь, пробую, экспериментирую. Последний раз редактировалось alex8888, 26.02.2010 в 13:40. Причина: добавление комментария |
|||
![]() |
|
||||
Для меня проще, ибо командные методы - тот еще головнячок. В одной версии команда может иметь одни опции, в другой - другие и пр. неприятности. Entmakex же будет работать одинаково и стабильно и в 2000, и в 2010 AutoCAD'е.
Цитата:
Делай как хочешь, просто мое мнение - от vl-cmdf и command в программе желательно избавляться. Если делаешь программу только для себя - то сойдет, а если планируется потом раздавать коллегам, то вполне может оказаться, что они не все работают в МСК. При использовании командных методов, об этом не надо задумываться - все всегда рисуется в текущей СК, а при использовании entmake о СК приходится всегда помнить и, при необходимости, производить преобразования. |
||||
![]() |
|
|||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
Цитата:
Ещё одну указал Do$ - никогда нельзя забывать про системы координат. Помнить, что get-функции возвращают точки в ПСК, command работает в ПСК, а данные примитивов будут в МСК. Цитата:
Самый худший путь. Любая программа должна вычислять, где она сама живет и где находятся требуемые файлы. Цитата:
|
||||
![]() |
|
||||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
ShaggyDoc
ну подскажи ты дураку, ну как мне сделать Цитата:
1. В пути к файлам настроек Када прописал директорию с моими Лиспами. 2. При вводе команды Appload прописал там где нарисован портфель, все Лиспы, которые нужно загружать каждый раз. Там набрался список из пары десятков уже. Книгу "САПР на базе Автокада" "пролистал" (штудирую по мере сил и возможностей), жаль представленные примеры без переработки проверить не могу - нерешенная проблема с отображением русского языка в каде. Да и профиль у меня машиностроительный, что несколько отличается от представленного в книге для строителей. Насчет Цитата:
![]() Цитата:
Цитата:
![]() ![]() Цитата:
|
|||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
В функцию http://forum.dwg.ru/showthread.php?t=16561 подставить свои маски lsp-файлов и последовательно выполнить (load file) - один из вариантов. Несмотря на некоторые трудности в последних версиях AutoCAD (см., например, http://autolisp.ru/2009/12/09/load_complie_write/ и http://autolisp.ru/2009/12/09/load_complie_write/ ) - вполне реальный.
Если не испугает использование библиотечных функций, вот тебе вариант рисования полилинии (вроде работало ![]() Код:
![]() --- P.S. По голове прошу не бить - она и без того "чугуниевая" ![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Кулик Алексей aka kpblc
спасибо, посмотрю на работе, а Цитата:
Что вкратце делает твоя функция рисования полилиний? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Сорри, вторая ссылка : http://autolisp.ru/2009/12/25/loadcomplie_write_2/
Как "что делает"? Если есть все библиотечные функции, то рисует полилинию с указанными параметрами. А в данном случае выступает в качестве примера для анализа, не более.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Кулик Алексей aka kpblc
Цитата:
![]() Например у меня в программе просто рисуется прямоугольник и скругляются его углы, которые выбираются в диалоговом окне. Все остальное рисуется и проставляется автоматом. Это просто прога для конкретно моей задачи. И составлял я ее только для облегчения работы, ускорения, для устранения повторяющихся монотонных вычислений и действий. С удовольствием использую коды форумчан, если они мне подходят и если я в них разобрался. Потому как все равно подстраиваю их под себя, например, перевожу всю кириллицу или добавляю слои, уровни и тп. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Кое-что о параметрах вызова, как я это понимаю: http://autolisp.ru/2009/10/21/lisp-overloading/
Какую? Какую будет приказано. Зачем? Ну было же приказано ![]() А я бы сначала сделал диалоговое окно, и потом по результатам выполнения рисовал полилинию.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Кулик Алексей aka kpblc
Цитата:
![]() ![]() |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Сейчас пытаюсь написать статью про динамические диалоговые окна...
А так, сразу: По поводу lsp:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
|||||||||||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Кулик Алексей aka kpblc
![]() ![]() Будем копать дальше. 1. Цитата:
(vla-StartUndoMark (vla-Get-ActiveDocument (vlax-Get-Acad-Object))) после команды (vl-load-com),а перед закрывающей скобкой основной функции после возврата переменных osmode и oldlay: (vla-EndUndoMark (vla-Get-ActiveDocument (vlax-Get-Acad-Object)))? Или нет? 2. Что значит Цитата:
Должен ли я при определении локальных переменных основной функции дописать туда msg и (или) *error* (хотя последнее- это команда) ? Или ты имеешь ввиду что то другое? 3. Цитата:
4. Цитата:
5. Цитата:
![]() 6. Цитата:
![]() 7. Цитата:
![]() 8. Цитата:
9. Цитата:
10. Цитата:
![]() 11. Цитата:
12. Цитата:
![]() |
||||||||||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
1. По факту у меня типовой код выглядит так:
Код:
2. Ошибки (скажу честно, повторяться лениво): http://autolisp.ru/2009/09/13/error-catch/ 3. Я бы делал, наверно, так (правда, я и привык к англ.вариантам): Код:
5. А как же rb1, rb2 и т.п.? 6. Давно не игрался с dcl, но я бы делал примерно так: Код:
Код:
7. Попробуй сделать так: Код:
- в каком документе создавать (ведь можно и не текущий обрабатывать) - если слоя нет, то его надо создавать и настраивать. - если слой есть, то его надо настраивать. - в слое есть свойство "типа линии". Этот тип линии может отсутствовать в документе, то есть его надо подгружать. Возможно, из нестандартных файлов *.lin. Которые, в свою очередь, могут находиться не в путях поиска. Закошмарил? ![]() 11. Либо делать через entmakex, либо через vla-addtext. Извини, сейчас полноценно показать не могу. А если все же использовать командные методы, то получится нечто типа: Код:
![]() 12. Не сейчас. Скажу честно, времени и мозгов именно сейчас не хватает ![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Кулик Алексей aka kpblc
к п.12 Понятно, не хочешь, чтобы я за тобой на карачках ползал ![]() Подскажи, пожалуйста, как сформировать полученный программой dwgru-browsefiles-in-directory список, чтобы передать его на загрузку. А то только показывается в окне, что есть по такому то пути такие то файлы и все. Тут сообразил, что если в программе задать (load file), где файл - мой лисп, то можно оперативно подгружать недостающие функции. Типа, если команда не найдена, то загрузить функцию с этой командой, потом снова выполнить ее. Это может заметно упростить листинг основной функции, введя несколько вспомогательных библиотечных. ![]() |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Русификатор не ставил?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 29.04.2010
Сообщений: 15
|
Ну он в комплекте шел, точнее сразу русифицированный ставился
А может я велосипед изобретаю? В целом задача тривиальная: есть функция (астроида), заданная параметрическим уравнением Код:
На любом другом языке сделал бы уже давно, а на лиспе всю ночь мучаюсь, и пока ничего. Может дадите волшебного пинка в нужном направлении? А, и самое главное - АвтоКАД 2005 Последний раз редактировалось magiker, 29.04.2010 в 10:05. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Эта ошибка была в версиях 2005 и, по-моему, в 2006. Попробуй SP поставить - вроде бы решалась проблема, но точно не помню
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 29.04.2010
Сообщений: 15
|
А где взять сервиспак на варезный кад? )
Все, вопрос снят. Нашел, качаю. Посмотрим, встанет ли он на левый серийник Еще такой вопрос по структуре программы на лиспе. Функция должна быть описана до ее первого вызова или не имеет значения? И как все-таки быть со скобками в функции, возвращающей значение? Учебник говорит что синтаксис такой (defun %FnName% (par1 par2 ...) (%FnBody%) ), и как пример - стандартный DtR (defun dtr (u) (* pi (/ u 180)) ;Это как я понимаю то значение которое функция должна вернуть ) А как быть если перед расчетом возвращаемого значения надо провести дополнительные расчеты? Последний раз редактировалось magiker, 29.04.2010 в 11:26. |
|||
![]() |
|
||||
Цитата:
Цитата:
Код:
|
||||
![]() |
|
||||
Разделяет список переменных на глобальные и локальные.
В данном случае, после выполнения функции test локальной переменной C будет присвоено то значение, которое у нее было до начала выполнения функции. |
||||
![]() |
|
||||
Цитата:
![]() Наверное, это следует понимать так: Как задать значение, которое вернет функция после ее вызова? Я ж показал, для при веденного выше примера - функция test: -обращаемся к функции: (test 1 2) но надо как-то сохранить результат работы функции, поэтому: - сохраняем возвращаемое значение: (setq test_rez (test 1 2)) А функция test будет всегда возвращать вычисленное значение своей локальной переменной C, потому что в коде после всех вычислений стоит C: Код:
|
||||
![]() |
|
||||
Регистрация: 29.04.2010
Сообщений: 15
|
Во =) Спасибо за доходчивое объяснение
З.ы. сорри за невнятные вопросы, вторые сутки не сплю, поэтому мозг немного притормаживает Установка СП1 на АвтоКАД 2005 убила серийник, что впрочем и ожидалось. Поставил 2010 Кад, но тут другая проблема... а где в нем автолисп? о.0 Нашел, невнимательно смотрел просто. Очередной вопрос возник. Как в команде (command "_.line" p1 p2) задать ширину (толщину) линии и ее цвет? Разобрался... Следующий вопрос Код:
![]() Т.е. в целом рисунок правильный, не считая углов. Не подскажите почему? Поэкспериментировал сейчас - оказывается если максимально приблизить рабочий лист перед выполнением программы то строится без проблем, точнее чем больше приближение тем меньше скос на углах. Как избавиться от этого? Надо чтоб рисовалось нормально, независимо от масштаба Решил немного изменить алгоритм. Пусть сначала все точки собираются в список, а потом из этих точек рисовать график. Т.е. в теории это выглядит так Код:
Результатом работы циклы должен стать список ((х1 у1) (х2 у2) (х3 у3) (х4 у4) ... ) Но если использовать list то скорее всего получится ((((((х1 у1) (х2 у2)) (х3 у3)) (х4 у4)) ... ) как-то так Вобщем, как правильно в цикле составить список точек, и главное - как из этого списка построить полилинию? Ну помогите кто-нибудь пожалуйста Со скошенными углами разобрался, концы отрезков прилепляются к ближайшей точке. Справился отключением данного параметра. Вопрос с формированием массива точек и рисованием линии из этого массива все еще актуален Последний раз редактировалось magiker, 30.04.2010 в 03:27. Причина: Включил мозг |
|||
![]() |
|
|||||
Инженер-строитель Регистрация: 15.08.2007
Киров
Сообщений: 2,204
|
Цитата:
Вот код: Код:
Цитата:
Код:
Цитата:
1. Функцию можно определять и после её первого вызова. 2. Слэш не разделяет список переменных на глобальные и локальные. Он отделяет аргументы функции от её локальных переменных. Глобальные переменные появляются, если они просто не прописаны явно как локальные. А аргументы тоже по-сути локальны, что доказыавает проверка: a=nil. |
||||
![]() |
|
||||
В показанном варианте вызова функции как такового не происходит. Это просто объявления двух функций, одна из которых используется внутри другой. Фактически, первый вызов был тут:
Код:
![]() Цитата:
![]() magiker, как я понял, у тебя сложность с формированием списка. Для этого есть две полезные функции: cons и append. Cons - добавление в список элемента на первое место, append - слияние списков в один. Примеры: Код:
- если второй аргумент не является списком или nil (nil по сути есть пустой список), то создастся точечная пара. Примеры: Код:
Код:
|
||||
![]() |
|
||||
Инженер-строитель Регистрация: 15.08.2007
Киров
Сообщений: 2,204
|
Цитата:
Код:
Дело в том, что сначала код загружается в память. Оперативную. Опеределённые программистом функции вносятся в список лисп-символов (на равне например со стандартными символами setq или тот же defun и т.п.), а потом уже происходит выполнение этого кода. Как-то так я всё это себе представляю. Хотя может быть мы вообще о разных вещах говорим. Добавлено: Вот кстати для наглядности. В смыле, что имел ввиду, говоря, что функция вносится в список лисп-символов. Цитата:
Последний раз редактировалось Makswell, 30.04.2010 в 09:36. |
|||
![]() |
|
||||
Регистрация: 29.04.2010
Сообщений: 15
|
Do$, Makswell, спасибо за советы. Со списками разобрался более-менее. Теперь у меня есть список вида ( (х1.у1) (х2.у2) (х3.у3) ... ) А как из точек, описанных в этом списке, построить линию? И не совсем понятно, что лучше использовать - _.line или _.pline
|
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
"_none" это опция привязкию По русски "Ничего". Попробуй вместо "_none" "_non". Геоникс случайно не установлен?
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Регистрация: 15.01.2010
Сообщений: 254
|
Нашел lisp...
Код:
Т.е. если, например, отрезок имеет начало в т. (548;762) и конец в (987;759), то сначала выравнивание по горизонтали, а затем - по точкам (550;760) - (985;760). Зачастую попадаются чертежи, выполненные без привязки или нарушенной ортогональностью |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
magiker, Убери "_none" совсем. А еще лучше покажи листинг того, что делаешь
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Регистрация: 29.04.2010
Сообщений: 15
|
VVA, опишу тогда все с самого начала для большего понимания. Дана функция, заданная параметрически, т.е.
x = Fx(t) y = Fy(t) Надо построить график этой функции На текущий момент код имеет такой вид Код:
Ну и совсем уж идеальный вариант - добавить функцию для рисования осей координат с делениями. И чтоб оси были одного цвета, а график чуть толще и другого цвета З.Ы. АвтоЛИСП, равно как и АвтоКАД, вижу впервые в своей жизни, так что за кривой код строго не судите |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
magiker, Вроде как так
Код:
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 02.05.2010 в 13:13. |
|||
![]() |
|
||||
Регистрация: 29.04.2010
Сообщений: 15
|
Спасибо, все работает. Только немного непонятно с толщиной (весом) линии. Пробовал разные значения - разницы так и не увидел. В чем подвох? )
И еще такой вопрос - как удалить все что нарисовано, очистить лист? С удалением разобрался, а вот с толщиной линии все еще не понятно. Разницы не вижу хоть убей Последний раз редактировалось magiker, 02.05.2010 в 20:40. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Цитата:
Код:
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 03.05.2010 в 18:04. Причина: Орфография |
|||
![]() |
|
||||
BIM, С#, AutoCAD, LISP Регистрация: 15.03.2006
Дуброво
Сообщений: 657
|
Добрый день!
Пополняю ряды чайников! ![]() Начал изучение лиспа с разбора кода, сделанного VVA. Весь файл находится в сообщении по этой ссылке: http://forum.dwg.ru/showpost.php?p=179141&postcount=1 пока что заткнулся на вот этой строке (выделено красным): Код:
1. ssnamex - извлекает примитив из набора по порядковому номеру 2. cadr - извлекает второй элемент из списка, который даёт (ssnamex ss) 3. mapcar - повторяет п. 2 с каждым элементом набора ss 4. listp - проверяет, является ли списком то, что получилось в результате п.3. заткнулся на функции vl-remove-if - не понял как работает. То есть через командную строку прогнал, посмотрел что на выходе даёт, но не понял как. в "Visual Lisp и секреты адаптации AutoCAD" (издание 2001 г.) читаю: "Удаляет из списка все элементы, возвращающие Т при проверке тест-функцией" тест-функция - здесь listp по этому описанию выходит, что эта функция удаляет из списка как раз те элементы, которые нам нужны, чего на практике не происходит.
__________________
"Молодой человек, Вы не представляете всей широты поставленной перед Вами задачи." © Панкратова Г.Е. Последний раз редактировалось kha, 04.05.2010 в 18:34. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Неверно. Найди разницу между функциями ssnameX и ssname
Цитата:
Цитата:
Цитата:
Функция vl-remove-if применяет тестовую ф-цию listp к каждому элементу списка, возвращенноно ф-цией п.2 и удаляет из списка те элементы, у которых listp вернула истину. Т.е. те элементы, которые являются списками, в том числе и nil - пустой список. Код:
то, на шаге 4 он принял бы вид (<Имя объекта: 7ef835f0> <Имя объекта: 7ef834d8>) Два последних элемента списка vl-remove-if удалит, так как если к ним применить listp, то она вернет истину.
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 05.05.2010 в 09:18. |
|||
![]() |
|
||||
BIM, С#, AutoCAD, LISP Регистрация: 15.03.2006
Дуброво
Сообщений: 657
|
VVA: спасибо за разъяснения, всё понял!
Буду копать дальше, потом выложу этот лисп с подробными пошаговыми комментариями. Ну и если возникнут вопросы по ходу изучения - буду писать сюда ![]()
__________________
"Молодой человек, Вы не представляете всей широты поставленной перед Вами задачи." © Панкратова Г.Е. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Ну и еще для развития. Есть список точек с координатами X,Y.
Код:
Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Цитата:
p.s. - все понял - хитр'о. p.p.s - тогда уж (mapcar '(lambda (f)(apply 'mapcar (cons f lst))) '(min max))
__________________
Когда в руках молоток все вокруг кажется гвоздями. Последний раз редактировалось Дима_, 05.05.2010 в 11:31. |
|||
![]() |
|
||||
Регистрация: 15.01.2010
Сообщений: 254
|
Прошу прощения за назойливость...
Никто не может помочь с http://forum.dwg.ru/showpost.php?p=562615&postcount=810 ??? |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
superkot007, У меня код так же работает. Может угол отклонения отрезка от оси больше указанного в команде
Цитата:
Код:
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 26.05.2010 в 10:38. Причина: Добавлены тексты, блоки |
|||
![]() |
|
||||
Регистрация: 15.01.2010
Сообщений: 254
|
Цитата:
![]() VVA Все как всегда - безупречно. Спасибо! Еще вопрос - можно сделать "разрывы" как, например, в MS Visio - при перемещении/удалении/добавлении отрезка "разрыв" изменяется соответствующим образом? И с проверкой принадлежности одинаковому слою??? "Топорный" вариант есть: Код:
Последний раз редактировалось superkot007, 05.05.2010 в 15:09. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Регистрация: 15.01.2010
Сообщений: 254
|
Цитата:
![]() Спасибо за наводку... |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Привет всем
![]() подскажите для моей конструкции: Код:
2. Что подставить вместо "*", чтобы была возможность выбрать конкретно, что сохранить (блоки, текст, уровни и тп)? Последний раз редактировалось Кулик Алексей aka kpblc, 10.05.2010 в 11:14. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
По п.1 исправил на следующую конструкцию:
Код:
Цитата:
Как поступить? |
|||
![]() |
|
||||
Честно говоря, никогда этой командой (wblock) не пользовался. Судя по описанию, с ее помощью можно сохранить блок чертежа в отдельном файле (вроде бы, только один). Поэтому, наверное, нужно из всего, что хочется сохранить в отдельный файл создать новый блок в чертеже, и уже его передавать в команду wblock. Опять же, с программным созданием блоков никогда не сталкивался (знаю только, что это возможно
![]() Хотя, насчет одного блока - это я ошибся. Вот так можно попробовать (без всяких проверок и пр.): Код:
Последний раз редактировалось Do$, 11.05.2010 в 09:37. |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Еще один вариант:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Кулик Алексей aka kpblc,
попытка выполнить твой лисп: 1. ругается на переопределение команды c:test, говорит что то про запрещенные символы и прерывания 2. при переименовании функции test в другую, в том числе и без с:, выскакивает Fehlerhafter Argumenttyp: VLA-OBJECT "G:\\Dateien-FH\\DrawingG\\DXF-LASER\\DXF von4401-4500\\4477-1.dwg" (ошибка типа аргумента), соответственно, на выходе нет Каков алгоритм использует твоя программа? Можешь вкратце для чайника разъяснить ![]() Do$, после переименования test в другую функцию работает ![]() Осталось только разобраться зачем введена команда copy и переменная ss ![]() |
|||
![]() |
|
||||
Да потому что я сделал код на скорую руку и для наглядности использовал командные методы. Команда "wblock" удаляет объекты после экспорта, поэтому пришлось сперва командой "copy" сделать копию объектов, которые собираемся экспортировать, поэтому и сохранение набора в переменной понадобилось... Использовать такое в качестве готовой функции, конечно же, нельзя!
У Алексея все довольно правильно сделано (вот не лень было заморочиться человеку ![]() Алгоритм его функции прост - создается набор из объектов, передается в метод WBLOCK (оказывается и такое есть в VLA!) и при помощи него экспортируется в новый чертеж. Есть необходимые проверки и все "по уму". Вставь то, что красным выделено в функцию и будет тебе счастье ![]() Код:
|
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Offtop: Во блин, ну надо же было так лохануться! Про указатель на документ забыл! Е-мое...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Do$,
Цитата:
![]() Хотя все же заработало. Конечно у Алексея все классно, но смысл то не только в том, что он пишет грамотно, кто бы сомневался, а в том чтобы тоже хоть граммулечку так же как и он научиться делать. После добавки его лисп заработал как часы. Спасибо. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
В справке есть такая функция
![]() ![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Кулик Алексей aka kpblc
Развернул таки справку, ессес-но на инглише (чуть не вырвалось на идише). Но ![]() Цитата:
Что, можно вместо object.WBlock просто вставлять vla-wblock, вместо object.SelectOnScreen - vla-onscreen? А например object.HasExtensionDictionary - vla-HasExtensionDictionary -тоже верно? А как определить, что за феня мне нужна? Там сто-о-о-олько методов и свойств ![]() ![]() |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
alex8888, так я ж ссылку дал, где про все это можно прочитать.
Offtop: Уже сильно хочется себе на сайт продублировать тот текст ![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Кулик Алексей aka kpblc,
если ты про это: Цитата:
то я просто хотел лишний раз удостовериться в этом. Прошу прощения за назойливость ![]() |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Ну, на самом деле про то, что справка VBA практически идеально подходит для работы с ActiveX. Самое главное - не забывать, что
Цитата:
![]() В качестве иллюстрации: если вариант замены веса линии для объекта в VBA выглядит как Код:
Код:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Кулик Алексей aka kpblc
если пошла такая пьянка, могу я попытать тебя еще? ![]() Пытаясь разобрать твой код , встретил непонятные места. Я буду расшифровывать, а ты подскажи, что мне не понятно, хорошо? Код:
![]() ![]() |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Скажу честно - сейчас времени нет катастрофически. Посему отсылаю к http://autolisp.ru/2009/09/13/error-catch/
С остальным, извини, чуть попозже.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Цитата:
В такой ситуации выражение: Код:
Код:
Я так думаю, что удаляется набор из чертежа с названием selsetname, если такой присутсвует уже в чертеже. А если не присутствует - то возникает ошибка (наверное, не проверял), которую "отлавливает" vl-catch-all-apply. |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
alex8888, Чтобы понять ACTIVEX, нужно разобраться с объектной моделью Автокада. Understand the AutoCAD Object Model
Кратко можно сказать, что модель состоит из Объектов и их Коллекций (совокупности объектов). Например Автокад состоит из коллекции открытых документов. Если взять документ, то он состоит из коллекций слоев, блоков, текстовых, размерных стилей. Причем пространство модели и листов - это так же блоки Автокада. Сам блок (модель, лист или блок элемент чертежа состоит из отрезков, дуг, полилиний и т.д.) Плюс помнить, что в Лиспе выполнение начинается с самого внутреннего(вложенного) оператора. Цитата:
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 15.05.2010 в 22:57. Причина: орфография |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
*vlr-cmd* - глобальная переменная, в которой запоминается указатель на командный реактор. Скажем пользователь взял и дважды (трижды и т.д.) в один документ в одном сеансе загрузил этот лисп.
Вопрос: сколько командных реакторов должно создаться? Поэтому и сделана проверка, если *vlr-cmd* не nil, значит кто-то раньше создавал реактор.
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
конструктор мебели Регистрация: 28.02.2010
г. Гатчина
Сообщений: 27
|
Так этот реактор запоминается в переменную с таким же именем. Или эта переменная не переопределяется при повторном присвоении какого-либо значения?
А так, в общем понял, для чего эта проверка. Спасибо еще раз. PS. Вопрос отменяется. Нашел информацию по реакторам, прочитал, все стало ясно. Последний раз редактировалось grachev.p, 14.05.2010 в 23:37. |
|||
![]() |
|
||||
Регистрация: 15.01.2010
Сообщений: 254
|
1. Перенос объекта (блок, текст, отрезок, полилиния и пр. 2D-объекты) с выбранной точкой в нужную точку на чертеже - как уйти от геморроя с шаговой привязкой?
2. Разбить M-TEXT в D-TEXT с сохранением, если возможно, выравниваний M-TEXT'а Кулик Алексей aka kpblc, это просьба чайника ![]() Что-то пропустил самое главное - вежливо попросить... Последний раз редактировалось superkot007, 16.05.2010 в 09:19. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
superkot007, и что это было?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Программист широкого профиля. Регистрация: 08.09.2005
Челябинск
Сообщений: 722
|
Цитата:
Вопрос: расчитать вероятность возникновения взрыва. |
|||
![]() |
|
||||
строю, ломаю Регистрация: 03.04.2008
Украина
Сообщений: 5,515
|
![]() Цитата:
Код:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Цитата:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 15.01.2010
Сообщений: 254
|
Можно попросить модифицировать LISP из http://forum.dwg.ru/showpost.php?p=564014&postcount=828 еще и "под" D-text и блоки (выравнивание по базовой точке)?
![]() Помогите, пожалуйста, со следующими проблемами 1. Перенос объекта (блок, текст, отрезок, и пр. 2D-объекты) с базовой точкой в нужную точку на чертеже? 2. Разбить M-TEXT в D-TEXT с сохранением, если возможно, выравниваний M-TEXT'а 3. Преобразование полилинии в отрезки (может, плохо искал по форуму, но не нашел; с преобразованием отрезков в полилинии видел темы) 4. Переделать lisp из G-tools Код:
P.S. Для циклической работы команд нужно добавить в пункте меню * (*^c^c) ? |
|||
![]() |
|
||||
конструктор мебели Регистрация: 28.02.2010
г. Гатчина
Сообщений: 27
|
|
|||
![]() |
|
||||
Регистрация: 15.01.2010
Сообщений: 254
|
Подходит для ограниченного круга задач...
1. Отрезки должны полностью или частично накладываться друг на друга 2. Если отрезки под углом, отличающимся от 0 - никакого толку от _overkill 3. Меню ET "закрыто" (настройка админская такая на работе) 4. Мелочь, но... "лишнее" диалоговое окно, да и с "буржуйским" напряжно... Хотя за совет спасибо ![]() |
|||
![]() |
|
||||
конструктор мебели Регистрация: 28.02.2010
г. Гатчина
Сообщений: 27
|
Подскажите пожалуйста.
Вот лисп, который делает подобие на нужный мне слой, величина которого зависит от масштаба аннотаций. Все бы ничего, не не пойму, как сделать так, чтобы при прерывании клавишей Esc или какой-либо другой командой слой все равно восстанавливался на тот, который был до выполнения этого лиспа? Код:
|
|||
![]() |
|
||||
1. Попробуй все command заменить на vl-cmdf
2. Используй это: http://forum.dwg.ru/showthread.php?t=22945 |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Основное выделил красным. Вдобавок не вижу смысла в том, чтобы перебирать и сортировать слои vl-* функциями для того, чтобы проверить наличие слоя. Кроме того опция _make команды _-layer создает слой и устанавливает его текущим. От конструкции (if (tblsearch "LAYER" "Кант") можно отказаться, оставив просто (command "_-Layer" ...)
Код:
Цитата:
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 26.05.2010 в 10:40. |
|||
![]() |
|
||||
конструктор мебели Регистрация: 28.02.2010
г. Гатчина
Сообщений: 27
|
Цитата:
Спасибо. Более менее теперь понял работу функции *error*. Цитата:
|
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
2. _explode или _Xplode на выбор
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Регистрация: 15.01.2010
Сообщений: 254
|
Цитата:
2. _explode разбивает в полилинии, _Xplode не дает никакого эффекта... ![]() Вообще пробовал на 2011-ом (хотя вряд ли от версии зависит) |
|||
![]() |
|
||||
конструктор мебели Регистрация: 28.02.2010
г. Гатчина
Сообщений: 27
|
Цитата:
Автокад тоже 2011. А _xplode тоже эффекта не дает. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Да, _XPLODE почему-то не разбивает мтекст. Сама команда задумывалась как расширение EXPLODE. Читать про XPLODE
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Очередная загвоздка
![]() Подскажите, как в коде http://forum.dwg.ru/showpost.php?p=565984&postcount=836 путем vla- выбрать только объекты с определенного уровня в выделяемой области? И насколько правильно командным методом вот так : Цитата:
|
|||
![]() |
|
||||
Регистрация: 15.01.2010
Сообщений: 254
|
Цитата:
![]() Во-первых - должно быть _menuload (у меня русский 2011-ый), во-вторых - спрашивает файл адаптации (а не меню)и все равно, ввод правильного имени меню ничего не дает, в-третьих - я просил прописывание путей к вспомогательным файлам (само меню загрузить не проблема, нудно прописывать папки для доступа) |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
Если уж советовать, то грамотно. Шоп работало. То есть имена команд и опций с префиксами, а имена файлов - полные, шоб с гарантией было. |
|||
![]() |
|
||||
строю, ломаю Регистрация: 03.04.2008
Украина
Сообщений: 5,515
|
![]() у меня bricscad и как теперь быть ![]() Все папки можно не прописывать, используя относительные пути... Посмотри здесь: http://dwg.ru/dnl/4649 как организовано... может найдешь чего полезного... ...еще вот к размышлению Код:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Можно. Геморройно в некоторых случаях, но можно.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 15.01.2010
Сообщений: 254
|
|
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Добрый день, все равно команды не работают на лиспе для определенной высоты текста, текущий текстовый стиль (высота стоит 0.00), скажите пожалуйста в чем ошибка и если не трудно поправьте. Исправно работает только кнопка масштаб, при попытке вызова команды текста пишет неизвестная команда. Асад 2010 англ..
Моя панелька Цитата:
Цитата:
__________________
:read: |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Попробуй убрать красненькое
Цитата:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Спасибо большое за помощь, после удаления нижнего подчеркивания не работала команда, в итоге между 2 и 5 убрал точку и все заработало.
Большая просьба к VVA посмотреть еще раз код, может у меня конечно что не так с автокадом, но панелька работает через раз, просто пишет неизвестная команда, или может я что не так загружаю, хотя там ничего хитрого нет, функция масштаба работает исправно, функция 3-х высот текста работает неверно - пишет неизвестная команда еще раз выкладываю панельку свою Цитата:
Цитата:
з.ы. будет ли разница для АС2010 на вин7 64 Заранее спасибо за помощь! да и еще вопросик, после подгрузки панельки через команду menuload в командной строке сначала активируется какая то команда RIBBON выгружая свою панель, и когда нажимаю на команду к примеру текста высотой 5мм в командной строке сначала активируется команда ribbon и после пишет для текста неизвестная команда!
__________________
:read: Последний раз редактировалось Lymus, 03.06.2010 в 22:21. Причина: ну не получается у меня :( |
||||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Кулик Алексей aka kpblc, измени, пожалуйста в лиспе
Цитата:
Никак не могу фильтр приспособить по типу ssget. Куда его засунуть? ![]() ![]() ![]() |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Что значит "уровня"? Слоя?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Где и как вводить имена слоев - понятно?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Кулик Алексей aka kpblc, Да, все ввел, работает, только опять нужно исправить в создании имени файла, дописать объект. Но здесь я уже научен.
![]() А вот все эти выкрутасы с кучей vla- ![]() Хотел было просто попробовать создать прямоугольник объектным методом , да что-то не найду подходящую функцию. Попробовал vla-add-rectangle и тому подобное - кад послал на некоторое расстояние и в местоположение ![]() Offtop: Больше не возился, пытался все твой лисп обсосать. Вот только проблема, если пробую выкинуть или упростить (ну там без проверки на ошибки) чего-нибудь для эксперимента, так обычно посылают ![]() |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Объекта "прямоугольник" не существует. Используй vla-addlightweightpolyline
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
А теперь добавь обработку: заблокированных слоев; выключенных слоев; примитивов внутри блоков. Гарантирую веселье
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 15.01.2010
Сообщений: 254
|
Цитата:
Я же и написал, что простенько - это не комбайн. Все слои у меня всегда включены (разморожены, разблокированы), в блоках нет M-текстов... Так что меня устраивает ![]() |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
Надо делать надежно - чтобы работало везде и всегда. С учетом всех возможных вариантов и ошибочных действий пользователя. |
|||
![]() |
|
||||
Разработчику приложений - да, инженеру для своих нужд - не обязательно. Зачем же, ради единожды в год применяемого в конкретном случае кода делать все обработки ошибок, предусматривать многочисленные варианты, о которых можешь даже и не подозревать?
|
||||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
А ведь их можно просто сразу не допускать. В том числе "детских" - отключение привязок, учет возможностей разной высоты текста в стилях и т.п. Тем более, что сейчас все написано и спросить есть где. Как говорил Аркадий Райкин - "сначала ребенок пишет на заборе буквы, но потом захочет писать слова..." |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Открытие файла: vla-open
Сохранение в формате: vla-saveas. Но вот будет ли поддерживаться формат R12 - еще вопрос.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Кулик Алексей aka kpblc, вот такая конструкция:
Код:
2. Метод vla-open как написано у Полещука, фактически не работает (для Document). Это как? Что имеется ввиду? 3. Код:
Последний раз редактировалось alex8888, 15.06.2010 в 11:41. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Попробуй так:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Значит, что-то еще подгружается и определяет функцию (test). Мне как-то не видать отседова
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
А на момент вызова vla-saveas разве переменная active_document инициализирована? Тут "запутка" в локальных и глобальных переменных.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
active_document берется из begin_activex, которая грузится раньше в этом же лиспе. И она не локальна. Не так?
А вот так? Код:
А самое интересное, что в этом случае сработало: Код:
![]() Нашел: вместо vla-get-documents было vla-get-ActiveDocument Да уж ![]() Последний раз редактировалось alex8888, 15.06.2010 в 16:28. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
В качестве иллюстрации к #916:
Код:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Почему? После вызова (fun2) проверь значение value. Просто она внутри функции fun2 "перекрывается" локальной переменной. Это же базовые понятия - область видимости функций и переменных! Как делается локальный обработчик ошибок в лиспе? Да точно по такому же принципу.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Ну, к примеру: http://www.sernam.ru/c_24.php и http://msdn.microsoft.com/ru-ru/library/1t0wsc67.aspx
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 25.09.2008
Новосибирск
Сообщений: 218
|
Вопрос знатокам VisualLisp по поводу команды begin_activex из поста #918.
Как правильнее: получать указатели на объекты (приложения, документа, пространств листа и модели) в каждом случае или хранить их в глобальных переменных? И второй вопрос по поводу загрузки lisp-функций. Насколько я понимаю основных вариантов два: загружать нужные файлы лисп непосредственно перед выполнением функции и загружать весь набор файлов с функциями при загрузке чертежа *.dwg. Кто как делает и почему?
__________________
www.saa-blogs.blogspot.com |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Тут ответ (по идее) не завязан на какой-то язык...
Указатели на документ, пространство модели, а также коллекции (например, коллекция слоев, или коллекция блоков), я думаю, лучше всего делать глобальными. Инициализировать при самом начале работы. По загрузке (если рассматривать некомпилированные коды) я вижу несколько вариантов: 1. Хранить все коды по принципу "один файл lsp = одно определение функции". 2. Все коды засовывать в один lsp-файл, который и подгружать 3. Каждый раз по новой прописывать определение нужных функций. У каждого из подходов есть свои плюсы и свои минусы...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 25.09.2008
Новосибирск
Сообщений: 218
|
Алексей, дилетантский вопрос: если в начале работы получить указатели на коллекции слоев, блоков, пространства модели, то будут ли они корректно восприниматься при добавлении новых слоев и т.д. или нужно будет заново их определять?
По поводу загрузки: прочитал твое эссе и не знаю, то ли оставить загрузку lisp-функций как она есть у меня сейчас (т.е. в каждом файле одна функция, при загрузке чертежа загружается функция, которая определяет все файлы с расширением lsp в указанном каталоге загружает их все подряд) или строить более сложную конструкцию на основе твоих функций. На данный момент все работает с моим топорным подходом, хотя там есть вложенные функции (например обработчик ошибок из "САПР на базе AutoCAD...", а там два или три уровня вложенности)
__________________
www.saa-blogs.blogspot.com |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Цитата:
![]() Создаем новый файл, в нем сразу (vl-load-com) и следом: Код:
Код:
Код:
Теперь насчет загрузки. Если (подчеркиваю - если!) у тебя AutoCAD до 2006 включительно (на 2007 не проверял); если у тебя в каждом lsp-файле только одна функция, которая не обращается к другим; или у тебя каждый lsp вручную засунут в автозагрузку,- то все, что я писал, становится неактуальным. Если же хотя бы одно из условий не соблюдается, то приходится изворачиваться. P.S. Что такое "вложенность" функций в твоем понимании? В моей интертрепации интерпретации - это определения локальных функций внутри основного кода. А у тебя?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 25.09.2008
Новосибирск
Сообщений: 218
|
AutoCAD 2009.
В каждом файле одна функция. Загрузка организована посредством такой функции Код:
Код:
__________________
www.saa-blogs.blogspot.com |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Наверное, дело в том, что у меня используется около 700 функций, при этом глубина "вложенности" запросто может превысить 10 уровней. К примеру:
Функция _kpblc-ent-create-scheduletable вызывает около 200 служебных функций. Есть там одна _kpblc-xml-nodes-get-child-by-tag - вызывает _kpblc-conv-value-to-string, _kpblc-property-get и _kpblc-xml-nodes-get-child. Последняя обращается к _kpblc-xml-conv-nodes-to-list. Эта, в свою очередь,- к _kpblc-error-catch, _kpblc-property-get, _kpblc-error-print. При этом для того, чтобы вызвать эту функцию (точнее, передать корректные параметры), приходится еще десяток функций вызывать с такими же "хвостами". В таких случаях мне приходится отслеживать приоритет загрузки функций, чтобы потом при вызове _kpblc-ent-create-scheduletable не получить сообщение вида "_kpblc-xml-conv-nodes-to-list не определена".
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 25.09.2008
Новосибирск
Сообщений: 218
|
Если не секрет, что делает _kpblc-ent-create-scheduletable?
В целом ясно. Пока проблем с загрузкой не возникает оставлю все как есть. И с функциями для работы с объектной моделью не буду велосипед изобретать, а возьму из ruCAD. Спасибо за разъяснения.
__________________
www.saa-blogs.blogspot.com |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
1. Исходные библиотечные функции находятся в отдельных LSP-файлах. Иногда в одном файле несколько родственных, хотя это отступление от концепции из-за лени автора. Всего таких функций около 2000. Все они записаны в файл проекта. 2. Из них компилируется один FAS. Размер примерно 600 кб. Этот файл автоматически загружается в каждый чертеж. Все библиотечные функции всегда доступны. Они обращаются друг друг к другу, но проблем не возникает, так как они всегда загружены в память одновременно. 3. Прикладные "программы" находятся в отдельных LSP и компилируются в отдельные FAS. Они используют только библиотечные функции и, иногда, какие-то функции, определенные в этом же файле. Но никогда из каких-то других. 4. Вызов "программ" осуществляется из меню AutoCAD, XML, с кнопок и т.п. При этом всегда в макрос вызова включается загрузка соответствующего FAS, или макрос вызывает библиотечную функцию. |
|||
![]() |
|
||||
Регистрация: 25.09.2008
Новосибирск
Сообщений: 218
|
ShaggyDoc, такой вопрос: компиляция функций происходит непосредственно перед загрузкой в файл чертежа или отдельно (т.е. все написали, собрали в один проект, скомпилировали и пользуемся, а если нужно что-то изменить, то компилировать заново).
У меня то тоже вроде все сразу загружается (хотя может я что-то не так понимаю), но Алексей говорит, что критичен порядок загрузки и сложность в этом. И еще: есть вот такой файл Код:
Код:
__________________
www.saa-blogs.blogspot.com |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
Цитата:
(setq *ru_acad-object* nil) - это как раз вызов функции вне тела. Сделал такой вызов для сброса указателя на объект во время процесса загрузки библиотеки. Затем, во время выполнения функции ru-obj-get-acad-object этот указатель восстановится. Такое "обниление" можно и не выполнять. Но тогда в памяти остаётся глобальная переменная, инициализированная при предыдущей загрузке библиотеки. Мало ли что я мог сделать потом - например присвоить глобальной *ru_acad-object* указатель на что-то другое, хотя бы ошибочно. Вот и страхуюсь. Чтобы после перегрузки указатель был правильный. |
|||
![]() |
|
||||
Регистрация: 25.09.2008
Новосибирск
Сообщений: 218
|
Для особо непонятливых (для меня то бишь): если мы загружаем файл А с определением функции 1 (в которой содержится обращение к фун.2) и вызовом фун.1 до загрузки файла В с определением функции 2, то будут проблемы, а если в файле А нет вызова функции 1, только ее определение, то загружать файлы А и В можно в любом порядке, лишь бы загрузить оба. Правильно я понимаю?
__________________
www.saa-blogs.blogspot.com |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
1. Отделять загрузку от использования. То есть формировать библиотеку функций. В файлах библиотечных функций не должно быть никаких вызовов других функций. Кроме "штатных", например setq. В этом случае загрузка может выполняться в любом порядке, но до использования. Не забываем, что функции могут перегружаться, заменяя прежнее определение. Если при загрузке сразу что-то используется могут быть обращения к старой версии. Такие ошибки трудно найти. 2. Вызовы функций должны быть только после полной загрузки библиотеки. 3. Загрузку библиотеки надо делать автоматически, например в acaddoc.lsp. Вот пример такого файла из ruCAD - он сгенерирован программой-стартером из шаблона, в момент загрузки выглядит так (дополнил комментариями): Код:
|
|||
![]() |
|
||||
Регистрация: 25.09.2008
Новосибирск
Сообщений: 218
|
ShaggyDoc, спасибо, теперь разобрался и уяснил.
__________________
www.saa-blogs.blogspot.com |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Кулик Алексей aka kpblc, с помощью vla-wblock можно также изменить тип записываемого файла (например, Dxf) , или он будет всегда Dwg текущей настройки?
2. Код: Код:
![]() |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
alex8888, я несколько раз перечитал вопрос, но так и не понял - ты про что спрашиваешь? Про vla-wblock или про vla-saveas?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Кулик Алексей aka kpblc,
прошу прощения за туманность. Ищу способ сохранить выбранные примитивы в файле Dwg и сохранить из в виде Dxf, причем самой ранней версии. Встал вопрос - или vla-wblock или vla-saveas. Первым пока не понял - возможно ли в принципе? А второй правильно создает файл, но тот почему то пустой, то есть я ничего не сохраняю кроме как просто пустой файл с нужным его типом. Offtop: Предыстория такая. Фирма, в которой мне доводится батрачить ![]() ![]() Но желательно бы до этого доковылять своими мозгами ![]() |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
vla-wblock сохраняет файл только в текущей версии. Не лечится.
vla-saveas по идее позволяет сохранить файл в формате R12. Что бы попытался сделать я: выбрать примитивы в текущем документе; создать новый документ (скорее всего, добавлением в коллекцию документов; ObjectDBX тут поможет как мертвому припарки) и через vla-CopyObjects выполняется копирование в сторонний файл. Потом этот файл и попытаться сохранить. P.S. Хотя я бы на твоем месте серьезно задумался о том, чтобы делать полноценную программную реализацию алгоритма оптимизации кроя листовых материалов, потом изучение DXF R12 и прямая запись нужных данных в файл. Голову, конечно, сломаешь (и не раз).
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Кулик Алексей aka kpblc,
Цитата:
![]() Так вот не совсем въезжаю что ты имеешь ввиду. Мой алгоритм такой: 1. Составление разверток компонентов изделия. 2. Поиск подходящего по формату листового материала. 3. Оптимальное размещение по листу разверток деталей. 4. Подготовка и печать сопроводительной документации. 5. Подготовка и пересылка DXF файла фирме, осуществляющей нарезку лазером. по 1 пункту имею как собственные наработки, так и сторонние программы. по 2-му все ясно, там кад почти не требуется, но программу составления формата листа я накатал - худо-бедно- работает. по 3-му - чисто художественное соображение - интуиция, расчет и тп. Так как все развертки индивидуальны и единичны в большинстве своем, то программным путем решить для меня пока не представляется вообразимым. Далее п.4 и 5. Здесь мне нужно как раз то о чем весь сыр-бор. Из вышеизложенного тобой делаю заключение, что без промежуточного файла не обойтись. Получается по-старому: файл *.dwg -> файл *-1.dwg (с выбранными примитивами и сопроводительным текстом к ним - только самое необходимое) с помощью vla-wblock -> файл DXF R12 для отправки. Здесь, наверное файл *-1.dwg надо преобразовывать в тип DXF R12 с помощью vla-open -> vla-SaveAs, но пока не получилось. Попытки преобразования описаны в посте 937. Если есть какие соображения - буду очень признателен ![]() |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
|
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
ShaggyDoc, ты "ето" к чему?
![]() Таков существующий расклад, ты просто не представляешь, насколько немцы любят все усложнять ![]() Что же по существу, то я тоже не представляю пока твою мысль Цитата:
![]() |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
![]() Например, такой функцией Цитата:
![]() |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Технически записать в файл строку за строкой понятно как, а вот:
Цитата:
![]() В качестве примера подброшу какой-нибудь из dxf и на нем посмотреть механизм обработки хотя бы приближенно? Во вложении все 3 файла - основной для разработки, промежуточный для перезаписи в dxf и сам dxf. |
|||
![]() |
|
||||
Регистрация: 27.07.2009
Сообщений: 28
|
Добрый день. Столкнулся с проблемой и уже длительное время не могу ее решить. Суть в том что написал програмку на lisp. Алгоритм программы построен на функции "grread" (было необходимо отслеживание координат курсора "в реальном времени" плюс возврат ключей в зависимости от нажатой кнопки на клавиатуре и мыши). И программа работает, но только при открытом Visual Lisp Editor. Если Visual Lisp Editor не открыт, то grread не отслеживает нажатие кнопок на клавиатуре и мыши (хотя координаты возвращает). Кто-нибудь сталкивался с подобной ситуацией?
|
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Кулик Алексей aka kpblc,помучаю дальше
![]() Изменил твою программу записи блока в файл в надежде решить свою задачу "тупым" методом, т.е. как вручную, без намеков уважаемого ShaggyDoc, потому как пока не представляю способа решения по его совету. Код:
Но вызываемая программа at_save_dwg-dxf Код:
ActiveX-Server gab folgenden Fehler zuruck: unbekannter Name: SaveAs то есть неизвестное имя SaveAs Что и где я накосячил ![]() Код не оптимизирован (пока он еще не работоспособный), отлова ошибок тоже еще не вставлял Последний раз редактировалось alex8888, 24.06.2010 в 11:05. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Первый аргумент - vla-указатель на открытый документ.
Второй аргумент - имя файла, под которым надо выполнять сохранения Третий - формат сохранения.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
vla-указатель на открытый документ - это (vla-get-documents (vlax-get-acad-object)),
а (vla-item (vla-get-documents (vlax-get-acad-object)) "DWGName") - это получение свойства у открытого документа, в частности имя? Или нет? Со вторым и третьим аргументом вроде бы ясно. Но вот первый вызывает сомнение и не только у меня - кад пишет ошибку автоматизации именно на этом месте. Вот здесь: Код:
![]() Последний раз редактировалось alex8888, 24.06.2010 в 12:47. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
(vla-get-documents (vlax-get-acad-object)) - это коллекция (или массив) открытых документов AutoCAD. Через vla-item ты получаешь указатель на конкретный элемент этой коллекции / массива. Ты же оперируешь с каким-то конкретным документом, верно?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
То есть это не один документ, а несколько? А я то думал, что тот, с которым оперируем в данный момент, но не активным.
А почему тогда вылетает в ошибку? Чем же каду не нравится "DWGName"? Через (vlax-dump-object (vla-get-documents (vlax-get-acad-object)) T) увидел, что Код:
Как получить указатель на открываемый объект (файл) в этой коллекции документов? Мне нужно знать имя открываемого файла (теоретически то верно). Только чей-то недоеду никак ![]() |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
DWGNAme - ну я так обозвал имя файла, который ты собираешься сохранять под другим именем и в другом формате.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Да
А сам как думаешь? ![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Думаю что не надо и получаю в ответ многозначащее:
Automatisierungsfehler. Keine Beschreibung verfugbar. (ошибка автоматизации. описание отсутствует) ![]() Как понять где? ![]() Затыка как писал выше в: (vla-item (vla-get-documents (vlax-get-acad-object)) wb_file1) Уже методом "тыка" все пререпробывал - не пускает дальше этой строки и все тут. ![]() |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
wb_file1 на момент вызова чему равна? А файл с таким именем открыт?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
1. На момент открытия wb_file1 равна названию файла, полученному при сохранении выборки примитивов с помощью vla-wblock. Проверил в окне наблюдения - там правильно.
2. Файл открывается в фоне, затем затыкается выполнение программы в этом месте и соответственно файл обратно не закрывается. Посмотри, может у тебя возникнет получше идея как из одного файла dwg получить dxf с выбранными элементами минуя промежуточный файл-1dwg. Пример файлов в посте: http://forum.dwg.ru/showpost.php?p=587269&postcount=945 Вот получившийся код, проблемное место выделено красным. Код:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Проверяй работу
![]() Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Кулик Алексей aka kpblc, спасибо, на работе завтра проверю
![]() Вроде бы проходит, только с именем файла я помудрю - пока пишется с двойным расширением (*.dwg.dxf) Что касаемо самого процесса, то опять темный лес. И почему я такой тупой ![]() Что происходит в этой строке: (cons 0 (1- (vla-get-count vla_selset))) ? В книге Полещука выглядит так: (vla-copyobjects <объекты - БМ объектов> [<владелец - vla-объект места назначения>] [<пары клонирования - переменная в которой массив пар клонирования>]). А что у нас: Код:
![]() Не понравилось. Когда вручную открываешь документ, сохраняешь как dxf последней модели ![]() ![]() Последний раз редактировалось alex8888, 25.06.2010 в 10:30. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Цитата:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Кулик Алексей aka kpblc, теперь все встало на свои места
![]() А то голову сломал в этих ухищрениях. Как насчет: Цитата:
![]() Последний раз редактировалось alex8888, 25.06.2010 в 11:58. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Скажу честно - я код гонял только на предмет "работает / не работает". Попробую посмотреть, но результат гарантировать не могу.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Прошу помощи опять
![]() Хочу скопировать объекты определенного фильтра (в данном случае со слоя 0) и вставить сюда же, но где то рядом. Что пропустил в vla-copyobjects или неправильно сделал. До точки "до сюда функция дошла" - все в порядке, а дальше посылают ... ![]() Код:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Это не сработает. Если надо копировать "рядом", не меняя пространство-владелец, то (если не прибегать, например, к командным методам), то проще будет воспользоваться командами vla-copy и vla-move - именно так, сначала одно, потом второе. Причины объяснены в справке, да и так видны
![]() Я не рассматриваю вариант "прочитать все примитивы, пересчитать все точки, построить примитивы заново".
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Алексей,
vla-copyobjects - клонирование объектов в: 1. другой файл, 2. другое пространство, 3. блок. <- это подходит для копирования объектов и последующей их вставки в текущее же пространство, файл, чертеж? Или это что-то другое? Можно ли создать блок, перенести его и расчленить? Или это работа через ж...? Набрал в предыдущий лисп (vla-copy vla_selset) , меня послали ![]() Какова должна быть последовательность действий? 1. vla-copy выбираемых объектов - они должны быть сохранены в какой-то переменной? 2. vla-move - указать 2 точки -откуда и куда переместить? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Ну ты ета... Короче, не того. И не этого
![]() Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Кулик Алексей aka kpblc, вот это оперативность!
![]() ![]() Только мне теперь опять неделю надо обсасывать твой код ![]() Как все-таки кардинальным образом меняется код только лишь от изменения крохотного условия задачи ![]() ![]() Спасибо. Алексей, код работает на ура. ![]() ![]() ![]() Последний раз редактировалось alex8888, 29.06.2010 в 10:20. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Ни фига себе - "крохотного"... Есть принципиальная разница между копированием объектов между владельцами и копированием объектов внутри одного владельца.
Кстати, все вот это можно заменить элементарным: Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
![]() ![]() Я в шоке! Но, в этом случае выбирать приходится вручную, можно попросту скопировать ненужное и упустить важное. Т.е. мне важнее все-таки отфильтрованные значения. Не знал, что копирование со сменой владельца и просто копирование это сильно разные вещи. Ведь там копирование и там, Ctrl+C + Ctrl+V работают одинаково. А тут такие страшности! Я уж подумал, что ты просто не хочешь меня подпустить к объектному методу программирования ![]() Маленький вопросик (просьбочка ![]() |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Лиспом это слишком геморройно. Если коротко, то надо а) создавать анонимный блок и б) искать тему "На заметку программистам" и брать оттуда готовые коды.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Принципиально - наверное, ни в чем. Привычка у меня такая - функция должна быть функцией ))
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Кулик Алексей aka kpblc, пожалуйста посмотри мой код ниже.
1. Проблема состоит в том, что у меня не получается объединить 2 полилинии в одну. Вручную они объединяются нормально. 2. Можно как-нибудь упростить расчет точек для сплайна или уменьшить их количество не в ущерб развертки? Код:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
alex8888, с точками я не стал разбираться. А объединение попробуй так:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Кулик Алексей aka kpblc, наверное, с точками ничего не поделаешь - там массив должен быть большой.
С объединением я решил по-другому: изменения в коде: Код:
Единственное, что boundary что то долго просчитывает у себя в уме ![]() |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Помогите пожалуйста немного с оптимизацией.
Произвожу расчет координат по горизонтали (L) и по вертикали (H) для построения кривой опираясь на координаты базовой точки, задаваемой извне (здесь - пользователем): Код:
Попробовал применить что то типа (strcat "L" (itoa i)) и (sqrt .... i...), где i - счетчик количества углов (синусов), используемых для построения, но не могу сделать переменную Li - она получается в виде "Li" и ее нельзя использовать например для setq |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
AtroksAlold, это ты про что?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
КИП, АСУ ТП, слаботочка Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422
|
Добрый день
Изучаю понемногу ЛИСП, в том числе и на примерах книги создателей РУ-КАДа. Периодически возникают вопросы, на которые не всегда удается найти ответ на форумах и в учебниках. Пока простой вопрос, может он даже слишком простой: записываю функцию только с локальными переменными, заданными явно Код:
Код:
|
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
когда ты обращаешся к ent - ты создаешь не локальную а ГЛОБАЛЬНУЮ переменную (т.к. в локальных ее нет), она доступна для всех лисп приложений - но на деле вероятность "конфликта" возрастает, если ими и пользоваться - то только с сильно уникальным именем (например например "название-функции_номер-подвресии_имя-автора_ent").
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
_.explode, что ли?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
КИП, АСУ ТП, слаботочка Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422
|
Спасибо за ответ. Теперь ясно )
Появились еще пара вопросов. Вот в этом коде, взятом из справки Код:
Цитата:
Если брать функцию для работы с другим объектом, напр. таблицей, то здесь мне почти все уже понятно: Код:
Цитата:
Код:
Код:
Цитата:
Надеюсь на ваши ответы ) Последний раз редактировалось Frigate, 03.09.2010 в 13:10. |
|||
![]() |
|
||||
Регистрация: 15.01.2010
Сообщений: 254
|
Блин, интересно, как же я пробовал и не получалось?!
![]() Спасибо! Не могу найти тему с переводом таблицы из AutoCAD (построена из отрезков) в Excel (помню же, была такая...) ![]() Нашел еще это - http://sites.google.com/site/bushman...tablic-v-excel, но что с ним делать? Последний раз редактировалось superkot007, 04.09.2010 в 17:43. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Frigate, mspace сначала надо определить. Например, так:
Код:
Я на autolisp.ru рассказывал о клавиатурных сокращениях. А в справке можно посмотреть, что означает acleftmask ![]() superkot007, я на ру-борде ответил.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 20.02.2009
Сообщений: 260
|
Начинаю разбираться в lisp. Возник такой вопрос: можно ли как-то обрабатывать прерывание (например, escape) выполнения команд в (command...), не прибегая к vla-? поиском не нашел
Пример кода: Код:
|
|||
![]() |
|
||||
Регистрация: 20.02.2009
Сообщений: 260
|
|
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
Цитата:
Но, чтобы например, в программе рисования чего-то можно было бы прервать, например, простановку размера, но продолжить выполнение кода дальше, надо использовать vl-catch-all-apply, vl-catch-all-error-p, vl-catch-all-error-message Эту святую троицу надо обернуть в свою функцию обработки ошибок, которую можно использовать тысячи раз. В очередной раз привожу код ловушки ошибок: Код:
Пример: Код:
И еще есть возможность обработки ERRNO. Вот пример: Код:
Используя такие простые приемы мы добиваемся, чтобы до *error* вообще никогда не доходило дело. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Может быть, ситуацию прояснит http://autolisp.ru/2009/09/20/howto_undo/
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
|
|||
![]() |
|
||||
КИП, АСУ ТП, слаботочка Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422
|
Еще раз здравствуйте, коллеги :-)
Продолжаю по возможности разбираться в LISPе. Назрели вопросы, которые необходимо уяснить для полноценного понимания программирования в LISP. 1. Почему для поиска всех блоков на рисунке используются следующие аргументы у функции ssget: (ssget '((0 . "INSERT"))) По DXF-кодам INSERT, как я понимаю, описывает ссылки на блок, блоки. А что же тогда значат DXF коды самого объекта “BLOCK” и как воспользоваться кодами объекта “BLOCK”? Причем там есть интересный такой код, под кодом 3 - тоже "Block name", как и код 2. Что это? 2. Когда набор (set selection) остался пустым – все его члены были удалены – как удалить сам набор, чтобы переменная, которой он присвоен, была nil? Я пока переменную, которой присвоет набор, приравниваю сначала к "0", а затем к nil (сразу nil не присваивается). |
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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 |