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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Я начинаю заниматься программированием LISP (help)

Я начинаю заниматься программированием LISP (help)

Ответ
Поиск в этой теме
Непрочитано 19.02.2006, 20:00 #1
Я начинаю заниматься программированием LISP (help)
mmax
 
Программист широкого профиля.
 
Челябинск
Регистрация: 08.09.2005
Сообщений: 722

Гопода, я начал этим заниматься совсем недавно, буквально в этом месяце. И у меня уже есть грандиозные планы например: чтобы автокад рисовал какие нибудь стандартные детали сам (болты, гайки шурупы итд)

И соответственно у меня начали появляться вопросы на которые г-н Полещук НН в своих произведениях не смог ответить в полном объеме, значит мне понадобится чья нибудь еще помощь.

У меня уже были вопросы которые я задал здесь и получил исчерпывающие ответы. Но если я на кждый вопрос буду создавать отдельный топик, то количество топиков будет = кол-ву вопросов, а вопросов миллион -- администраторы и модераторы данного ресурса наверное понимают о чем я. Да и такое кол-во ссылок не влезет мой..........

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

Всем заранее благодарен.
Просмотров: 80011
 
Непрочитано 19.02.2006, 22:06
#2
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,291


Есть и обратное соображение:
mmax задает вопросы чтоб получить ответы.
Эти ответы могут быть полезны не только mmaxу.
Система один вопрос - один ответ облегчает поиск ответов.
Но на практике это тоже редко работает - чаще всего обсуждение начинает уходить в сторону от темы, ветвиться...

В общем, мысли вслух. На самом деле я не знаю как лучше.
Pilot вне форума  
 
Непрочитано 19.02.2006, 22:48
#3
pyatifan


 
Регистрация: 29.10.2005
Нижегородская обл.
Сообщений: 219
<phrase 1=


О, тык это любимое дело, нас хоть хлебом не корми

http://dwg.ru/forum/viewtopic.php?t=...r=asc&start=15
pyatifan вне форума  
 
Непрочитано 20.02.2006, 00:39 Re: Я начинаю заниматься программированием LISP (help)
#4
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от mmax
а вопросов миллион
На три четверти (если не больше) вопросов можно найти ответы при помощи поиска. Как здесь, так и на форуме www.autocad.ru (многие темы можно читать как художественную литературу ) Про Яндекс с Гуглем тоже забывать не надо. А также, в хелп заглядывать в первую очередь.
Самое лучшее - разбирать код готовых программ, однако (!), далеко не везде и не всегда соблюдены "правила хорошего тона" программирования, где то при помощи Лиспа тупо изобразили Command-код (иногда без него трудно что то сделать, аккуратно повернуть UCS, к примеру, но в большинстве случаев можно использовать более шустрые методы). Посмотри Лиспы, которые идут с АКАДом и с Экспрессами (хотя, последние порой сильно запутаны), их то писали профи.

Цитата:
чтобы автокад рисовал какие нибудь стандартные детали сам (болты, гайки шурупы итд)
Программ для этого добра в сети есть, однако, удобней использовать блоки. (ИМХО)
vk вне форума  
 
Автор темы   Непрочитано 20.02.2006, 15:38
#5
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Программ для этого добра в сети есть, однако, удобней использовать блоки
Блоки плохо редактировать

А как сохранить текущую UCS?

Какой способ посоветуете применить для заполнения штампа -- щелкнул мышью по полю штампа после предлагается ввести текст ??
?
?
?
mmax вне форума  
 
Непрочитано 20.02.2006, 15:43
#6
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от mmax
Блоки плохо редактировать
Ну это смотря какие блоки Динамические блоки достаточно просто редактировать, правда, с их созданием первые два раза придется помучиться (или почитать документацию )
Сохранить текущую USC - а полностью задачу скажи. Может оказаться, что не надо ее сохранять (сам с таким столкнулся).
Цитата:
Сообщение от mmax
Какой способ посоветуете применить для заполнения штампа -- щелкнул мышью по полю штампа после предлагается ввести текст ??
Так просто на ура не получится. Либо использовать дин.блоки с таблицей внутри их (и заполнять уже таблицу), либо обычные блоки с атрибутами. Ни первый, ни второй вариант идеалом не будут ИМХО.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.02.2006, 15:59
#7
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


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

Цитата:
А как сохранить текущую UCS?
Если оно надо, то для работы с ПСК предпочитаю использовать (command "_.ucs".......) во всем ее многообразии. Хотя, удалять временные ПСК можно и через vla- методы, а вот создавать значительно сложней.
vk вне форума  
 
Непрочитано 20.02.2006, 16:00
#8
Кулик Алексей aka kpblc
Moderator

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


> vk : Но инфу-то в свойства сначала засунуть надо, а это уже другая песня немного (ЯТД).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.02.2006, 19:38
#9
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


> kpblc:
Ага, надо. Это можно легко сделать программно для группы файлов. Смысл такой что с одной стороны, в блок штампа напрямую мало чего пишется (разве что номер листа), а с другой стороны имеется доступ (на чтение точно) к свойствам без открытия файла. Только количество ограничено... Однако, не без изъянов: в блоке таблица, в ячейке таблицы поле - не обновляется автоматически (2005).
vk вне форума  
 
Непрочитано 21.02.2006, 08:36
#10
Кулик Алексей aka kpblc
Moderator

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


> vk : так-так-так, помедленнее пожалуйста.
Сделать программно для группы файлов - да, можно. только файлы надо вскрывать в фоновом режиме када (либо вообще в отдельном процессе) со всеми вытекающими.
Цитата:
Сообщение от vk
<..>Количество ограниченно<...>
- количество чего? Свойств файла? В 2005, по-моему, явного ограничения на количество свойств (имею в виду пользовательские) нет.
Поле в блоке, мне так кажется, вообще хреново работает. Проще уж использовать атрибут, наверное?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.02.2006, 08:59
#11
Profan


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


Сейчас гуру затеют полемику, а mmax будет только таращиться...
Profan вне форума  
 
Непрочитано 21.02.2006, 09:06
#12
Кулик Алексей aka kpblc
Moderator

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


> Profan : Уболтал, чертяка языкатый Я заткнулся.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.02.2006, 09:43
#13
Fogel

люблю мастерить
 
Регистрация: 21.01.2005
Челябинск
Сообщений: 10,381


Не, писать самому то что есть готовое... Только если ради тренировки Поставь механикс (второй если хочешь соблюсти букву закона) и пользуйся на здоровье. Мне их штамп понравился.
Fogel вне форума  
 
Непрочитано 21.02.2006, 09:47
#14
Кулик Алексей aka kpblc
Moderator

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


> Fogel : (только прошу - без обид, ок?) MechaniCS 2.0, работает только под 2002. И, кроме того, грешит массой глюков.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.02.2006, 11:20
#15
v_alex


 
Регистрация: 24.10.2005
Новокузнецк
Сообщений: 1,124
<phrase 1=


у меня штамп блоком сделан... объект... авторский коллектив и тп в свойствах файла прописаны и через field в штамп вставляются... так же дата и имя файла с номером закладки... номер и название листа прописываются в атрибутах блока... может несовсем правильно выразился, ГУРУу поправят...
v_alex вне форума  
 
Непрочитано 21.02.2006, 12:56
#16
Fogel

люблю мастерить
 
Регистрация: 21.01.2005
Челябинск
Сообщений: 10,381


Цитата:
Сообщение от kpblc
> Fogel : (только прошу - без обид, ок?) MechaniCS 2.0, работает только под 2002. И, кроме того, грешит массой глюков.
Обижаться не продуктивно! Я ж про "законно" пишу А незаконно можно и пятерку поставить - у них штамп стал еще лучше Да и множество приятных мелочей содержится.
Fogel вне форума  
 
Непрочитано 21.02.2006, 13:32
#17
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


> v_alex
Аналогично.

> kpbls
Цитата:
Поле в блоке, мне так кажется, вообще хреново работает. Проще уж использовать атрибут, наверное?
Угу, имеют место странности. Еще бы атрибуты были б так же автоматизированы как поля....
Про ограничение не уверен, как то десятка хватает, а больше пока не надо было...
vk вне форума  
 
Непрочитано 21.02.2006, 13:36
#18
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от kpblc
> vk : так-так-так, помедленнее пожалуйста.
Сделать программно для группы файлов - да, можно. только файлы надо вскрывать в фоновом режиме када (либо вообще в отдельном процессе) со всеми вытекающими.
А для кого я специально писал arx-файл? http://www.autocad.ru/cgi-bin/f1/board.cgi?t=22781xo
Александр Ривилис вне форума  
 
Непрочитано 21.02.2006, 13:47
#19
Кулик Алексей aka kpblc
Moderator

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


> Александр Ривилис : Так тут просто изначально, я так понял, разговор шел про LISP. Ваш файл у меня пользуется популярностью, за что Вам огромное спасибо.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 22.02.2006, 11:39
#20
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


У меня есть кое какая необычная задумка.
Так как геометрия штампа нам заранее известна, то с помощью ENTMAKE или COMMAND можно сразу заполнить все поля без проблем, те сначала создать функции заполнения с неопределенными переменными он с определенными точками вставки.

Остается только заставить систему по щелчку мыши определить какая ячейка выбрана.

Для этого мы возьмем и каждую ячейку заштрихуем с помощью вышеуказанных функций, и с помощью ENTLAST получим имена всех штриховок -- теперь каждой ячейке соответствует какаято переменная с именем штриховки. Далее идет в бой функция ENTSEL где пользователю предлагается выбрать какой нибудь объект... конец очевиден -- система получила данные о выбранной ячейке. После того как ячейка заполняется ENTDEL удаляет штриховку.

Как вам такой вариант?

Ну а UCS здесь нужна для того чтобы не высчитывать нечто универсальное для любого положения штампа относительно МСК или ПСК проще ее перенести в левый нижний угол штампа, впринципе все равно системе нужно знать где находится штамп, те в начале нужно указать левый нижний угол штапа, а потм когда штам будет заполнен ее надо будет вернуть на место, для этого и нужно сохранить ее начальное положение.

Ну а потом возникает вопрос как заставить однострочный текст разместиться в две и более строки в поле названия чертежа если название длинное? здесь наверное нужно применить многострочный текс
mmax вне форума  
 
Непрочитано 22.02.2006, 11:50
#21
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от mmax
Так как геометрия штампа нам заранее известна<..>
Не совсем. Штамп может быть для первого листа, для последующего, для чертежей строительных изделий...
Цитата:
Сообщение от mmax
то с помощью ENTMAKE или COMMAND можно сразу заполнить все поля без проблем, те сначала создать функции заполнения с неопределенными переменными он с определенными точками вставки.
И чего? Повторно вставить такой блок будет уже невозможно. Действия пользователя, как правило, труднопредсказуемы, поэтому приходится извращаться.
Или идет попытка вставки не блока, а просто таблицы? Если именно таблица как примитив када, то там в ней нет вообще однострочного текста - только многострочные, да вдобавок со своим редактором (2005) [/quote]
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.02.2006, 12:39
#22
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


А если посмотреть в сторону анонимных блоков? Смысл такой что при каждой правке штампа старый блок отдает в Лисп-программу свои данные, Лисп рисует новый блок с новыми данными и вставляет на место. Чтоб не париться с выковыриванием текущих данных из примитивов блока, сохранять их желательно в XDATA. Примерно вот так.
Неиспользуемые анонимные блоки пургенятся автоматом толи при сохранении файла, то ли при открытии... Ну это если на блоках замкнуться....
vk вне форума  
 
Непрочитано 22.02.2006, 12:54
#23
Кулик Алексей aka kpblc
Moderator

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


> vk : при всем уважении, немного позволю себе поспорить.
Анонимные блоки не вычищаются. Вычищаются автоматически при закрытии файла блоки разбитых размеров *D. Почему и невозможно восстановить разбитые размеры, кстати.
По поводу XDATA... Выяснил я тут одну маленькую тонкость - известно, что их размер ограничен 16кб. Так вот, эти 16 кб дербанятся между всеми зарегистрированными приложениями. Именно поэтому добавить свои XDATA в ВЭ, например, практически нереально - они уже заняты собственно кадом. ИМХО - использовать функции (vlax-ldata-get) и (vlax-ldata-put) - тогда автоматом пишется и словарь, и данные неограничены в объеме. Эдуард тут рассказал, что у него здоровенный файл с такими штуками свободно ворочался.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.02.2006, 13:51
#24
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


> kpblc
Удаляются. И еще, переименовываются. Можно проверить такой функцией:
Код:
[Выделить все]
(vlax-for i (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) (princ (vla-get-name i)) (princ"\n") (princ))
Напихать в чертеж анонимных блоков,
сохранить,
поглядеть список,
удалить блок-два-три...,
сохранить и закрыть чертеж,
открыть, поглядеть список блоков (там же будут *Model_Space, *Paper_Space....),
и тэдэ....

Про объемы... 16 килобайт XDATA на каждый примитив... ИМХО, достаточно одного примитива чтоб прицепить к нему все переменные данные блока (ну, разве что кроме логотипа-картинки). Если все же этого не хватит, кто мешает использовать еще один примитив... Хотя, есть конечно и словари. Я об том что данные должны храниться компактно в специально определенном месте (это может быть и внешний файл в принципе), а не выковыриваться из TEXT'ов, содержащихся в блоке... Это конечно не сложно сделать, но к чему лишние трудности? Сама по себе графическая часть блока должна только отображать данные.
vk вне форума  
 
Автор темы   Непрочитано 23.02.2006, 03:55
#25
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Блоки и таблицы – это не сейчас.

У меня на подходе программа рисующая форматы А1-4 со штампом Ф1 потом я к ней прилеплю Ф2 и Ф2а, строительством не занимаюсь.
Рисоваться они будут с помощью отрезков, для толщин линий будут созданы соответствующие слои.
Над заполнением штампа я еще размышляю. Предложенный мною способ, описанный выше, даже мне кажется немного извращенным и сложным и очень трудно будет его адаптировать под обезьяну с гранатой.
Думаю, лучше будет создать диалог похожий на штамп – так будет удобнее и проще. Худо-бедный DCL генератор я всетаки раздобыл http://www.cad.dp.ua/files/dcg101.zip
Вобщем как я понимаю в этом вопросе спасение утопающих очень сложная задача.

Подскажите тогда такое:
При рисовании _LINE очень часто приходится первую точку щелкать мышью или указывать с клавиатуры, а вторую, указав направление мышью, ввести длину линии те одно число.
Как бы этот способ реализовать с помощью Command или vl-cmdf. Область применения я еще пока не определил, но хотелось бы знать заранее вдруг приспичит.
mmax вне форума  
 
Непрочитано 23.02.2006, 10:05
#26
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Первую точку определяешь как список (как обычно), а для ожидания пользовательского ввода есть служебное слово pause, его вместо второй точки.
vk вне форума  
 
Автор темы   Непрочитано 23.02.2006, 14:30
#27
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Столкнулся с такой проблемой

Код:
[Выделить все]
(if (progn
              (условие 1)
               (условие 2)
                (условие 3)
                 );;progn
(Выполнить действие)
);;if
Получается, что если хотябы одно условие верно действие выполняется. Мне бы холтелось бы наоборот -- хотябы одно условие не верно -- действие не выполнять
mmax вне форума  
 
Автор темы   Непрочитано 23.02.2006, 14:32
#28
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от vk
Первую точку определяешь как список (как обычно), а для ожидания пользовательского ввода есть служебное слово pause, его вместо второй точки.
А как с направлением?
mmax вне форума  
 
Непрочитано 23.02.2006, 15:35
#29
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от mmax
Столкнулся с такой проблемой

Код:
[Выделить все]
(if (progn
              (условие 1)
               (условие 2)
                (условие 3)
                 );;progn
(Выполнить действие)
);;if
Получается, что если хотябы одно условие верно действие выполняется. Мне бы холтелось бы наоборот -- хотябы одно условие не верно -- действие не выполнять
Эт кто ж Вас научил такому? Правильней все же так
Код:
[Выделить все]
(if (and
       (условие 1)
       (условие 2)
       (условие 3)
     );;and
   (progn
    (Выполнить действие)
    (Выполнить действие)
    (Выполнить действие)
    (Выполнить действие)
  );;progn
);;if
Ну и почитайте документацию по применению логических функций
vk вне форума  
 
Непрочитано 23.02.2006, 15:40
#30
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от mmax
Цитата:
Сообщение от vk
Первую точку определяешь как список (как обычно), а для ожидания пользовательского ввода есть служебное слово pause, его вместо второй точки.
А как с направлением?
А что с направлением? Вы ж хотите
Цитата:
а вторую, указав направление мышью, ввести длину линии те одно число.
так и возюкайте мышОм для направления
vk вне форума  
 
Автор темы   Непрочитано 24.02.2006, 23:09
#31
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Всем привет

Оцените мое первое произведение.

samo_format_dialog.DCL

Код:
[Выделить все]
samo_format_dialog : dialog {
    label = "Вставка форматов ГОСТ 2.301-68 и 2.104-68 ЕСКД";
    : boxed_radio_row {
        label = "Вставить формат (Основная надпись Ф1)";
        mnemonic = "В";
        : radio_button {
            label = "A1";
            value = "1";
            key = "a1_s";
            mnemonic = "A";
        }
        : radio_button {
            label = "A2";
            value = "0";
            key = "a2_s";
            mnemonic = "A";
        }
        : radio_button {
            label = "A3";
            value = "0";
            key = "a3_s";
            mnemonic = "A";
        }
        : radio_button {
            label = "A4";
            value = "0";
            key = "a4_s";
            mnemonic = "A";
        }
    }
    : boxed_radio_row {
        label = "Пложение листа";
        mnemonic = "П";
        : radio_button {
            label = "Горизонтально";
            value = "1";
            key = "gor_s";
            mnemonic = "Г";
        }
        : radio_button {
            label = "Вертикально";
            value = "0";
            key = "ver_s";
            mnemonic = "В";
        }
    }
    : boxed_radio_row {
        label = "Точка вставки (Левый нижний угол листа)";
        mnemonic = "Т";
        : radio_button {
            label = "(0,0)";
            value = "1";
            key = "t_vst_00_s";
            mnemonic = "(";
        }
        : radio_button {
            label = "Указать";
            value = "0";
            key = "t_vst_u_s";
            mnemonic = "У";
        }
    }
    ok_cancel;
}
samo_format.lsp

Код:
[Выделить все]
;SamoCad
;******************************************************************
;********************Программа вставки форматов********************
;******************************************************************

;******************************************************************
;******************************************************************
;************************* (С) maksimov.m *************************
;******************************************************************
;******************************************************************

;;Вводим данные с помощью диалога;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;(defun c:f_mmax_q (/)
(setq s_load_dial (load_dialog "samo_format_dialog.dcl")
      )
(new_dialog "samo_format_dialog" s_load_dial "" '(-1 -1)
  )
А вот здесь идет несколько интересный момент
Продолжение samo_format.lsp
Код:
[Выделить все]
;А4 не бывает горизонтальным===============================
(action_tile "a4_s"  "(progn
                       (setq a4_no_gor (get_tile \"a4_s\"))
                       (setq a4_no_gor_ve (atof a4_no_gor))
                         (if (= a4_no_gor_ve 1)
                         (progn
                          (mode_tile \"gor_s\" 1)
                           (set_tile \"ver_s\" \"1\")
                           )
                           )
                           )";progn1"
  )
;;А4 не бывает горизонтальным?
;togda придется делать эту фигню для каждой кнопки
(action_tile "a1_s"  "(progn
                       (setq a1_yes_gor (get_tile \"a1_s\"))
                       (setq a1_yes_gor_ve (atof a1_yes_gor))
                         (if (= a1_yes_gor_ve 1)
                         
                          (mode_tile \"gor_s\" 0)
                          )
                        )";progn
)

(action_tile "a2_s"  "(progn
                       (setq a2_yes_gor (get_tile \"a2_s\"))
                       (setq a2_yes_gor_ve (atof a2_yes_gor))
                         (if (= a2_yes_gor_ve 1)
                         
                          (mode_tile \"gor_s\" 0)
                          )
                        )";progn
)

(action_tile "a3_s"  "(progn
                       (setq a3_yes_gor (get_tile \"a3_s\"))
                       (setq a3_yes_gor_ve (atof a3_yes_gor))
                         (if (= a2_yes_gor_ve 1)
                         
                          (mode_tile \"gor_s\" 0)
                          )
                        )";progn
)
обратите внимание на переменные a4_no_gor a1_yes_gor итд, а так же которые переведены в вещественные.
Все они имеют значение 1 независимо от выбранных радиокнопок.
И не смотря на это диалог работает нормально


Продолжение samo_format.lsp
Код:
[Выделить все]
;нажатие кнопки ок=======================================
(action_tile "accept"
  "(progn
     (setq s_a1_form (get_tile \"a1_s\")
           s_a2_form (get_tile \"a2_s\")
           s_a3_form (get_tile \"a3_s\")
           s_a4_form (get_tile \"a4_s\")
           s_gor_form (get_tile \"gor_s\")
           s_ver_form (get_tile \"ver_s\")
           s_vst_00 (get_tile \"t_vst_00_s\")
           s_vst_u (get_tile \"t_vst_u_s\")
           )
         (done_dialog 1))")



;нажатие кнопки otmena============================
(action_tile "cancel"
  "(exit)")
(start_dialog)

;;;;;;;Перевод строковых в вещественные или целые ;) посмотрим на их поведение
(setq s_a1_form_ve (atof s_a1_form)
      s_a2_form_ve (atof s_a2_form)
      s_a3_form_ve (atof s_a3_form)
      s_a4_form_ve (atof s_a4_form)
      s_gor_form_ve (atof s_gor_form)
      s_ver_form_ve (atof s_ver_form)
      s_vst_00_ve (atof s_vst_00)
      s_vst_u_ve (atof s_vst_u)
      )

;;Вводим данные с помощью диалога;;;;end


;;;;;;;;;;;создание слоев;;;;;;;;;;;;;;;;;;;;;;

;;;;;;создадим слой для tonkih линий
(vl-cmdf "_.layer" "_m" "Рамка_тонкие_текст"  "" )

;;;;;;создадим слой для жирных линий
(vl-cmdf "_.layer" "_m" "Рамка_жирные_" "_lw" 0.7 "" "")
;===================================================

;;;;;;;;;;;;;;;Точки вставки;;;;;;;;;;;;;;;;;;
(if (= s_vst_00_ve 1) (setq samo_t_vst_q '(0 0)))
(if (= s_vst_u_ve 1) (setq samo_t_vst_q (getpoint "\nУкажите левый нижний угол листа")))


;;;;;Сохраним UCS
(setq old_samo_ucs (getvar "ucsorg"))

;;;;;Сохраним привязки

(setq old_orto_samo (getvar "orthomode"))
(setq old_snap_samo (getvar "snapmode"))
(setq old_osnap_samo (getvar "osmode"))

;;;;;;;;Отключим привязки
(setvar "orthomode" 0)
(setvar "snapmode" 0)
(setvar "osmode" 0)




;;;;;;;;;;;;;;(С)maksimov.m;;;;;;;;;;;;;;;;
;Штамп Ф1======программа рисования штампа
(defun samo_shtamp (/)
;;;;чертим жирные линии
(vl-cmdf "_.layer" "_s" "Рамка_жирные_"  "" )

(vl-cmdf "_.line" '(0 0) '(0 55)  "")
  (setq samo_none_line (entlast))
(vl-cmdf "_.line" '(0 55) '(185 55) "")
(vl-cmdf "_.line" '(0 35) '(65 35) "")
(vl-cmdf "_.line" '(0 30) '(65 30) "")
(vl-cmdf "_.line" '(7 55) '(7 30) "")
(vl-cmdf "_.line" '(17 55) '(17 0) "")
(vl-cmdf "_.line" '(40 55) '(40 0) "")
(vl-cmdf "_.line" '(55 55) '(55 0) "")
(vl-cmdf "_.line" '(65 55) '(65 0) "")
(vl-cmdf "_.line" '(65 15) '(185 15) "")
(vl-cmdf "_.line" '(65 40) '(185 40) "")
(vl-cmdf "_.line" '(135 35) '(185 35) "")
(vl-cmdf "_.line" '(135 20) '(185 20) "")
(vl-cmdf "_.line" '(135 40) '(135 0) "")
(vl-cmdf "_.line" '(150 40) '(150 20) "")
(vl-cmdf "_.line" '(167 40) '(167 20) "")
(vl-cmdf "_.line" '(155 20) '(155 15) "")
  (gc)

;;;;тонкие
(vl-cmdf "_.layer" "_s" "Рамка_тонкие_текст"  "" )

;текст
  (vl-cmdf "_style" "SamoShtamptext" "%systemroot%\\Fonts\\isocpeui.ttf" 2.5 1.0 0 "_N" "_n")
(command "_.text"  '(0.5 31)  0 "Изм" )
(command "_.text"  '(8 31) 0  "Лист" )
(command "_.text"  '(18 31) 0  "№докум" )
(command "_.text"  '(41 31) 0 "Подп" )
(command "_.text"  '(56 31) 0  "Дата" )
(command "_.text"  '(1 26) 0  "Разраб" )
(command "_.text"  '(1 21) 0  "Пров")
(command "_.text"  '(1 16) 0  "Т.контр" )	   
(command "_.text"  '(1 6) 0  "Н.контр" )
(command "_.text"  '(1 1) 0  "Утв")
(command "_.text"  '(136 36) 0  "Лит" )
(command "_.text"  '(151 36) 0  "Масса" )
(command "_.text"  '(168 36) 0 "Масшт" )
(command "_.text"  '(136 16) 0  "Лист" )
(command "_.text"  '(156 16) 0  "Листов" )
  
(vl-cmdf "_.line" '(0 5) '(65 5) "")
(vl-cmdf "_.line" '(0 10) '(65 10) "")
(vl-cmdf "_.line" '(0 15) '(65 15) "")
(vl-cmdf "_.line" '(0 20) '(65 20) "")
(vl-cmdf "_.line" '(0 25) '(65 25) "")
(vl-cmdf "_.line" '(0 40) '(65 40) "")
(vl-cmdf "_.line" '(0 45) '(65 45) "")
(vl-cmdf "_.line" '(0 50) '(65 50) "")
(vl-cmdf "_.line" '(140 35) '(140 20) "")
(vl-cmdf "_.line" '(145 35) '(145 20) "")
);;;;defun
;;;;;;;;;;;;;программа рисования штампа end;;;;;;;;;

;;;;;;;;;Формат вертикальный

(defun samo_a1_vert_q (/)
(vl-cmdf "_.layer" "_s" "Рамка_тонкие_текст"  "" )
(vl-cmdf "_.ucs" "_m"  samo_t_vst_q)
(vl-cmdf "_.rectang" '(0 0) '(594 841))
(vl-cmdf "_.layer" "_s" "Рамка_жирные_"  "" )
(vl-cmdf "_.rectang" '(20 5) '(589 836))
 (vl-cmdf "_.ucs" "_m"  '(404 5))
  (samo_shtamp)
 );;;defun

(defun samo_a2_vert_q (/)
(vl-cmdf "_.layer" "_s" "Рамка_тонкие_текст"  "" )
(vl-cmdf "_.ucs" "_m"  samo_t_vst_q)
(vl-cmdf "_.rectang" '(0 0) '(420 594))
(vl-cmdf "_.layer" "_s" "Рамка_жирные_"  "" )
(vl-cmdf "_.rectang" '(20 5) '(415 589))
 (vl-cmdf "_.ucs" "_m"  '(230 5))
  (samo_shtamp)
 );;;defun

(defun samo_a3_vert_q (/)
(vl-cmdf "_.layer" "_s" "Рамка_тонкие_текст"  "" )
(vl-cmdf "_.ucs" "_m"  samo_t_vst_q)
(vl-cmdf "_.rectang" '(0 0) '(297 420))
(vl-cmdf "_.layer" "_s" "Рамка_жирные_"  "" )
(vl-cmdf "_.rectang" '(20 5) '(292 415))
 (vl-cmdf "_.ucs" "_m"  '(107 5))
  (samo_shtamp)
 );;;defun

(defun samo_a4_vert_q (/)
(vl-cmdf "_.layer" "_s" "Рамка_тонкие_текст"  "" )
(vl-cmdf "_.ucs" "_m"  samo_t_vst_q)
(vl-cmdf "_.rectang" '(0 0) '(210 297))
(vl-cmdf "_.layer" "_s" "Рамка_жирные_"  "" )
(vl-cmdf "_.rectang" '(20 5) '(205 292))
 (vl-cmdf "_.ucs" "_m"  '(20 5))
  (samo_shtamp)
  (entdel samo_none_line)
 );;;defun

;;;;;;;;;Формат горизонтальный

(defun samo_a1_gor_q (/)
(vl-cmdf "_.layer" "_s" "Рамка_тонкие_текст"  "" )
(vl-cmdf "_.ucs" "_m"  samo_t_vst_q)
(vl-cmdf "_.rectang" '(0 0) '(841 594))
(vl-cmdf "_.layer" "_s" "Рамка_жирные_"  "" )
(vl-cmdf "_.rectang" '(20 5) '(836 589))
 (vl-cmdf "_.ucs" "_m"  '(651 5))
  (samo_shtamp)
 );;;defun

(defun samo_a2_gor_q (/)
(vl-cmdf "_.layer" "_s" "Рамка_тонкие_текст"  "" )
(vl-cmdf "_.ucs" "_m"  samo_t_vst_q)
(vl-cmdf "_.rectang" '(0 0) '(594 420))
(vl-cmdf "_.layer" "_s" "Рамка_жирные_"  "" )
(vl-cmdf "_.rectang" '(20 5) '(589 415))
 (vl-cmdf "_.ucs" "_m"  '(404 5))
  (samo_shtamp)
 );;;defun

(defun samo_a3_gor_q (/)
(vl-cmdf "_.layer" "_s" "Рамка_тонкие_текст"  "" )
(vl-cmdf "_.ucs" "_m"  samo_t_vst_q)
(vl-cmdf "_.rectang" '(0 0) '(420 297))
(vl-cmdf "_.layer" "_s" "Рамка_жирные_"  "" )
(vl-cmdf "_.rectang" '(20 5) '(415 292))
 (vl-cmdf "_.ucs" "_m"  '(230 5))
  (samo_shtamp)
 );;;defun

;;;;;;;;;;;;;;;Рисуем вертикальные форматы

(defun risuem_vert (/)
  (if (= s_a1_form_ve 1) (samo_a1_vert_q))
  (if (= s_a2_form_ve 1) (samo_a2_vert_q))
  (if (= s_a3_form_ve 1) (samo_a3_vert_q))
  (if (= s_a4_form_ve 1) (samo_a4_vert_q))
  )

;;;;;;;;рисуем горизонтальные форматы

(defun risuem_gor (/)
  (if (= s_a1_form_ve 1) (samo_a1_gor_q))
  (if (= s_a2_form_ve 1) (samo_a2_gor_q))
  (if (= s_a3_form_ve 1) (samo_a3_gor_q))
  )
  

;;;;;;;;;;;;;;;;;;;запуск рисования 
(if (= s_ver_form_ve 1) (risuem_vert))
(if (= s_gor_form_ve 1) (risuem_gor))


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun samo_ucs_vozvrat (/)
(vl-cmdf "_.ucs" "_w")
)

(defun samo_ucs_vozvrat2 (/)
  (vl-cmdf "_.ucs" "_w")
  (vl-cmdf "_.ucs" "_m" old_samo_ucs)
  )


(if (eq old_samo_ucs '(0.0 0.0 0.0)) (samo_ucs_vozvrat) (samo_ucs_vozvrat2))

;;;;;;;;Возвратитм привязки
(setvar "orthomode" old_orto_samo)
(setvar "snapmode" old_snap_samo)
(setvar "osmode" old_osnap_samo)

;Убьем диалог
(unload_dialog  s_load_dial)


;)
Создавал с помощью визуал лисп – замучался.
Если из редактора VL приложения запускаются нормально, то с помощью (load “lsp”) из командной строки моя программа которую я считал полностью законченной оказалась очень глючной. Но всеже с глюками я разобрался и теперь хочу узнать какие глюки этой программы будут на чужих компьютерах, скорее всего они будут тк системные переменные мои и ваши могут отличаться и будут вызывать очередные глюки.

Прошу всех опробовать и высказать свое мнение и отзывы.
mmax вне форума  
 
Непрочитано 25.02.2006, 00:14
#32
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Много кода... Ниасилил...

Навскидку:

Цитата:
(defun c:f_mmax_q (/)
..............
И какого дъявола распинались мы тут про локализацию переменных? Дело хозяйское, ловите глюки....

Цитата:
(defun samo_a1_vert_q (/)
(vl-cmdf "_.layer" "_s" "Рамка_тонкие_текст" "" )
(vl-cmdf "_.ucs" "_m" samo_t_vst_q) ..........

(defun samo_a2_vert_q (/)
(vl-cmdf "_.layer" "_s" "Рамка_тонкие_текст" "" )
(vl-cmdf "_.ucs" "_m" samo_t_vst_q) ...........
и так далее.
Ну млин... оно же не просто так называется ФУНКЦИЯ !
Передайте ОДНОЙ функции "Рисовать_Рамку" всего то пару аргументов "Формат" и "Стоймя_ЛЁжмя" - и программа сократится наполовину. Трудоемкость отладки - вчетверо.

Цитата:
(defun risuem_vert (/)
(if (= s_a1_form_ve 1) (samo_a1_vert_q))
(if (= s_a2_form_ve 1) (samo_a2_vert_q))
(if (= s_a3_form_ve 1) (samo_a3_vert_q))
(if (= s_a4_form_ve 1) (samo_a4_vert_q))
)

;;;;;;;;рисуем горизонтальные форматы

(defun risuem_gor (/)
(if (= s_a1_form_ve 1) (samo_a1_gor_q))
(if (= s_a2_form_ve 1) (samo_a2_gor_q))
(if (= s_a3_form_ve 1) (samo_a3_gor_q))
)
ээээ....про функцию (cond ...) что нибудь слышали? Впрочем, она тоже не нужна, потому что см. выше.

Цитата:
системные переменные мои и ваши могут отличаться и будут вызывать очередные глюки.
Пишите программу так, чтоб она работала независимо от значений системных переменных. А если возможно - то и независимо от версий АКАДа, хотя бы от 2002 (или 2000) до 2006. В противном случае, у программы будет один единственный пользователь. Попоробуйте догадаться, кто

PS не пробовал, патамушта обещали глюки.
PPS Хинт: длинную портянку кода можно сохранить как файл и прикрепить к сообщению, дабы не загромождать страничку форума. Для этого даже придумали специальное поле с кнопочкой "Обзор"
vk вне форума  
 
Непрочитано 25.02.2006, 01:23
#33
Vika


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


Я совершенно новый человек в программировании. но очень хочется попробовать научиться Автолиспу, книги Полещука, на которую все ссылаются на форуме, не могу достать в магазинах, может, кто-то скажет, даст ссылочку на электронную версию сего продукта? Если начинать, то лучше сначала, скачала множество различных руководств пользователя, и для программирования в частности. Но самих азов нигде нашла. Если можете, помогите .
__________________
Muchas gracias, senores!
Vika вне форума  
 
Непрочитано 25.02.2006, 02:12
#34
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


>Vika
Электронную версию вряд ли где то найдете. Как минимум, потому что это не в интересах автора. Вполне возможно, что где то валяется сканированая книга, однако, работать с такой ну уж если только совсем от безысходности....

Поищите классический хит от Аутодеск - "Садовую дорожку". Видел в сети русскоязычную версию, хотя и довольно старую. Однако, для понимания основ, этого вполне достаточно. Не стесняйтесь заглядывать в HELP - там есть множество примеров.
vk вне форума  
 
Непрочитано 25.02.2006, 04:14
#35
forMA


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


Учиться прикладному программированию, занятие конечно полезное и нужное. Но вот относительно рамок и штампов даже не знаю как сказать, что бы не разозлить почтенную публику. Короче, в результате многолетнего использования всяческих программ, блоков, шаблонов в AutoCAD-е и в других CAD-ах осталось только две "синтетические рамки": горизонтальная и вертикальная. Тяну Stretch- ем. И горя не знаю. . А с появлением ACAD-2006 с экранным редактированием текста я вообще на все приблуды по оформлению рамок и штампов "забил". Типа, есть дела и поважнее. Может быть я глубоко не прав и нахожусь в крайней степени заблуждения, но от суровой правды жизни никуда не денешься. Так оно есть на сегодняшний день. Есть предложение потренироваться на ....фланце в 2d и 3d. И я бы поучился и программа, уверен, получилась бы востребованная и как бы типовая. Как предложение? Что скажете?
forMA вне форума  
 
Автор темы   Непрочитано 25.02.2006, 11:20
#36
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от Vika
научиться Автолиспу, книги Полещука, на которую все ссылаются на форуме, не могу достать в магазинах
www.books.ru
В этом месяце купил у них Visual LISP и секреты адаптации AutoCAD Полещука, так же там есть все его произведения. Недостаток в том, что книгу почтой ждать долго и дороже рублей на 50 выходит.

И первое мое произведение, хоть и освистанное профессионалами, вы уже можете опробовать.

У меня конечно уже давно была книжечка AutoCAD 2004:Разработка приложений и адаптация но по ней с нуля вряд ли чего поймешь, разве что DCL в обеих одинаковый.
mmax вне форума  
 
Непрочитано 25.02.2006, 12:24
#37
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Цитата:
Сообщение от vk
Цитата:
Сообщение от mmax
Столкнулся с такой проблемой

Код:
[Выделить все]
(if (progn
              (условие 1)
               (условие 2)
                (условие 3)
                 );;progn
(Выполнить действие)
);;if
Получается, что если хотябы одно условие верно действие выполняется. Мне бы холтелось бы наоборот -- хотябы одно условие не верно -- действие не выполнять
Эт кто ж Вас научил такому? Правильней все же так
Код:
[Выделить все]
(if (and
       (условие 1)
       (условие 2)
       (условие 3)
     );;and
   (progn
    (Выполнить действие)
    (Выполнить действие)
    (Выполнить действие)
    (Выполнить действие)
  );;progn
);;if
Ну и почитайте документацию по применению логических функций
Странно, у меня фАйл в PDF, там также как у него написано и не получается нифига.
Скажите а как добавить ELSe?
favorite вне форума  
 
Непрочитано 25.02.2006, 12:27
#38
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Скажите а в чем отличие vl-cmdf от command/


Изучаю Lisp по пособиям в инете поэтому не все операторы есть.
vl-cmdf вообще еще ниразу не видел.
favorite вне форума  
 
Непрочитано 25.02.2006, 12:30
#39
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Цитата:
Сообщение от mmax
Цитата:
Сообщение от Vika
научиться Автолиспу, книги Полещука, на которую все ссылаются на форуме, не могу достать в магазинах
www.books.ru
В этом месяце купил у них Visual LISP и секреты адаптации AutoCAD Полещука, так же там есть все его произведения. Недостаток в том, что книгу почтой ждать долго и дороже рублей на 50 выходит.

И первое мое произведение, хоть и освистанное профессионалами, вы уже можете опробовать.

У меня конечно уже давно была книжечка AutoCAD 2004:Разработка приложений и адаптация но по ней с нуля вряд ли чего поймешь, разве что DCL в обеих одинаковый.
Таже проблема . Секреты адаптации AutoCAD Полещука я купил а LISp не могу найти. Не знаю все магазины в центре и не только обощел нет нигде. Поэтому изучаю по пособиям из инета.
favorite вне форума  
 
Автор темы   Непрочитано 25.02.2006, 12:37
#40
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от favorite
Таже проблема . Секреты адаптации AutoCAD Полещука я купил а LISp не могу найти. Не знаю все магазины в центре и не только обощел нет нигде. Поэтому изучаю по пособиям из инета.
Visual LISP и секреты адаптации AutoCAD
AutoCAD 2004:Разработка приложений и адаптация
это две разные книги
Покупай почтой
mmax вне форума  
 
Автор темы   Непрочитано 25.02.2006, 12:38
#41
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от vk
Много кода... Ниасилил...

Освистали

Ну да ладно, когдато я в автокаде и элипса не мог начертить.

А освистали зря -- многа кода это потому, что она работает без глюков(у меня). Я не стал заниматься математикой чтобы высчитать положения рамок и штампов, прсто я решил двигать ПСК и все рисования рести от левого нижнего угла и возвращать ее на место в конце программы, тоже самое и с привязками(здесь сам Полещук подсказал)

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


Например очень полезная вещь на мой взгляд

Код:
[Выделить все]
(vl-cmdf "_layer или _style или _hatch итд" "")
вместо диалоговых окон, операции выводит командную строку, что облегчает создание программ с помощью COMMAND те увидев глазами командный сценарий данных операций мне становится легче писать программу создания слоя, текстового стиля, штриховки.
Впринципе должны быть команды-дубли работающие без диалогов, но я их не знаю, а если это какие нибудь ситемные переменные отключающие диалоги в этих командах, то их я трогать не хочу тк придется возвращать обратно.
mmax вне форума  
 
Автор темы   Непрочитано 25.02.2006, 12:43
#42
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от forMA
Учиться прикладному программированию, занятие конечно полезное и нужное. Но вот относительно рамок и штампов даже не знаю как сказать, что бы не разозлить почтенную публику. Короче, в результате многолетнего использования всяческих программ, блоков, шаблонов в AutoCAD-е и в других CAD-ах осталось только две "синтетические рамки": горизонтальная и вертикальная. Тяну Stretch- ем. И горя не знаю. . А с появлением ACAD-2006 с экранным редактированием текста я вообще на все приблуды по оформлению рамок и штампов "забил". Типа, есть дела и поважнее. Может быть я глубоко не прав и нахожусь в крайней степени заблуждения, но от суровой правды жизни никуда не денешься. Так оно есть на сегодняшний день. Есть предложение потренироваться на ....фланце в 2d и 3d. И я бы поучился и программа, уверен, получилась бы востребованная и как бы типовая. Как предложение? Что скажете?
forMA, это мое первое произведение
Например в первом классе школы учат таблицу умножения.
Здесь примерно тоже самое.
И эту хигню я продам какому нибудь студенту с кафедры САПР там им такие задания на дом дают.
mmax вне форума  
 
Непрочитано 25.02.2006, 13:11
#43
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от favorite
Скажите а в чем отличие vl-cmdf от command/


Изучаю Lisp по пособиям в инете поэтому не все операторы есть.
vl-cmdf вообще еще ниразу не видел.
В первом приближении это практически одно и то же.

Маленький секрет: в Лиспе нет ни одного оператора. Есть только функции. Кстати, все они достаточно подробно описаны в хелпе. Даже с примерами.

Цитата:
Странно, у меня фАйл в PDF, там также как у него написано и не получается нифига.
Что написано? Как у кого написано? что не получается?

Цитата:
Скажите а как добавить ELSe?
Третий аргумент функции (if)
vk вне форума  
 
Непрочитано 25.02.2006, 13:35
#44
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от mmax
Цитата:
Сообщение от vk
Много кода... Ниасилил...

Освистали

Ну да ладно, когдато я в автокаде и элипса не мог начертить.

А освистали зря -- многа кода это потому, что она работает без глюков(у меня).
Не хотел обижать. Извини.
vk вне форума  
 
Непрочитано 25.02.2006, 13:40
#45
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Код:
[Выделить все]
(Setq DLSVAI (getint "Çàäàéòå äëèíó ñâàè Ì 6Ì 8Ì 10Ì:"))
 (if (and
       (= DLSAVAI 6 )
       (= DLSAVAI 8 )
       (= DLSAVAI 10)
     )
(progn (Setq DLSVAI dLSVAI))
       (Setq DLSVAI (getint "Çàäàéòå äëèíó ñâàè Ì 6Ì 8Ì 10Ì:"))
   (terpri)
 )
Посмотрите почему ошибку выдает.

Здесь идет проверка длины сваи на соответствие , если такой длины нет, то должен производится запрос на ввод заново.
favorite вне форума  
 
Непрочитано 25.02.2006, 14:31
#46
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Тэээксь...
Запускаем, смотрим что пишет
Цитата:
_$
; error: too many arguments: (IF ................
Потому форматируем код в удобочитаемый вид
Код:
[Выделить все]
(if (and
      (= DLSAVAI 6)
      (= DLSAVAI 8)
      (= DLSAVAI 10)
    ) ;_  and
  (progn
    (setq DLSVAI dLSVAI)
  ) ;_  progn
  (setq DLSVAI (getint "Введите длину:"))
  (terpri)
) ;_  if
....и обнаруживаем, что в функцию if передали не три, а четыре аргумента. Один лишний.
vk вне форума  
 
Непрочитано 25.02.2006, 14:35
#47
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Вдогонку:
Запутались в алгоритме....
так проще
Код:
[Выделить все]
(if (member DLSAVAI '(6 8 10))
  ..............
vk вне форума  
 
Непрочитано 25.02.2006, 16:36
#48
forMA


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


для mmax
-----------------
Цитата:
И эту хигню я продам какому нибудь студенту с кафедры САПР там им такие задания на дом дают.
Н-да...А, я дурак распинался. :cry: Опять облом...
Ну что же. Желаю успеха в коммерции...
forMA вне форума  
 
Автор темы   Непрочитано 25.02.2006, 17:21
#49
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от forMA
для mmax
-----------------
Цитата:
И эту хигню я продам какому нибудь студенту с кафедры САПР там им такие задания на дом дают.
Н-да...А, я дурак распинался. :cry: Опять облом...
Ну что же. Желаю успеха в коммерции...
forMA, прошу не обижаться. Хигней я назвал свое первое произведение исскуств -- программу рисования рамки и штампа. Не знаю насколько она будет востребована среди студентов кафедры САПР, но проект мой некоммерческий. Создавая этот "шедевр" я познал многие вещи -- GP отдыхает, но и советы vk не пропадут даром.

А вот насчет фланцев это ты верно подметил. Меня просто убивает рисовать эти чертовы круги в кругах, а по краям еще маленькие кружочки, а если это еще фланец муфты вала то еще + шпоночный паз, а еще бывают лючки разной формы, прародителем которых является все тот же круглый фланец, вобщем полная ....... учитывая еще то, что черчение я с детства ненавижу.
Так что не думай что проблема фланцев интересна только тебе одному.

Создать программу рисования фланца, вид с торца, я хочу уже давно. идея родилась еще раньше чем я обзавелся необходимыми бумажными справочными пособиями по ЛИСПУ.
Алгоритм этой программы я пока еще ношу в голове тк программировать еще не умею.
Жди, скоро выйдет в свет и эта программа, но сначала я займусь болтами.
mmax вне форума  
 
Непрочитано 25.02.2006, 19:32
#50
pyatifan


 
Регистрация: 29.10.2005
Нижегородская обл.
Сообщений: 219
<phrase 1=


>mmax и forMA
хочу вас поддержать в этих начинаниях, в смысле параметризации, и в частности 3-х мерной на lisp
Я сам студент.
Вот курсовой:
http://dwg.ru/forum/attach_dwg/1139695170.dwg
(расширение заменить на zip); выкладывал сдесь уже как-то раз, в теме про дин. блоки (которые кстати меня и разочеровали в конце концов). Фычертил ферму в 3D. Есть мысли параметризировать, (хотя разбиение на виды в акаде некудышное).
С удовольчтвием посмотрю на Ваши заморочки. И если их окажется мало, то брошу Inventor и сяду за этого коня Vlisp.
pyatifan вне форума  
 
Непрочитано 25.02.2006, 19:50
#51
forMA


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


для pyatifan
--------------------
Цитата:
то брошу Inventor
Может не следует делать такие резкие движения. Одно другому не помешает.
forMA вне форума  
 
Непрочитано 25.02.2006, 21:33
#52
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Помогите мне сделать модуль проверки длины сваи.
Программа должна , если длины нет, делать запрос на ввод длины сваи заново, если есть выполняться дальше.У меня почему-то она из
цикла не выходет, если я после не правильной длины задаю правильную.
Код:
[Выделить все]
 (While (and
      (/= DLSAVAI 6)
      (/= DLSAVAI 8)
      (/= DLSAVAI 10)
       )
(progn  (Setq DLSVAI (getint "Çàäàéòå äëèíó ñâàè Ì 6Ì 8Ì 10Ì:")))
)
favorite вне форума  
 
Непрочитано 25.02.2006, 21:56
#53
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


> favorite
Код:
[Выделить все]
(while (not (member dlsavai '(6 8 10)))
  (initget 7)
  (setq dlsavai (getint "\nВыбрать длину [6/8/10] : "))
)


(princ "\nВы выбрали длину ")
(princ dlsavai)
(princ)

PS на всякий случай, проверяйте по буквам имена переменных
Цитата:
(/= DLSAVAI 10)
)
(progn (Setq DLSVAI
vk вне форума  
 
Непрочитано 25.02.2006, 21:59
#54
Profan


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


У меня какая-то абракадабра отображается, только кажется мне, что DLSAVAI и DLSVAI - разные переменные.
Profan вне форума  
 
Непрочитано 25.02.2006, 22:03
#55
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


> Profan

Именно так, не успел отослать )
vk вне форума  
 
Непрочитано 25.02.2006, 22:07
#56
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Спасибо большое , а то запарился прям не мог сделать.
favorite вне форума  
 
Непрочитано 25.02.2006, 22:18
#57
Profan


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


Для VK
Я вот видел, когда посылал свое сообщение, что вы не успел, однако, когда посмотрел тему еще раз, то увидел, что вы каким-то образом успел.
Profan вне форума  
 
Непрочитано 25.02.2006, 22:21
#58
Profan


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


А, увидел, у меня появились две кнопочки: "Правка" и "Крестик".
Profan вне форума  
 
Непрочитано 25.02.2006, 22:24
#59
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от Profan
что вы каким-то образом успел.
Просто мы одновремено делали... Я правил свое сообщение, а Вы отсылали свое
vk вне форума  
 
Непрочитано 25.02.2006, 22:32
#60
Profan


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


Наверное. У меня до этого не было кнопки "Правка", вот я и удивился.
Profan вне форума  
 
Автор темы   Непрочитано 25.02.2006, 23:02
#61
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от vk
Цитата:
Сообщение от mmax
Столкнулся с такой проблемой

Код:
[Выделить все]
(if (progn
              (условие 1)
               (условие 2)
                (условие 3)
                 );;progn
(Выполнить действие)
);;if
Получается, что если хотябы одно условие верно действие выполняется. Мне бы холтелось бы наоборот -- хотябы одно условие не верно -- действие не выполнять
Эт кто ж Вас научил такому? Правильней все же так
Код:
[Выделить все]
(if (and
       (условие 1)
       (условие 2)
       (условие 3)
     );;and
   (progn
    (Выполнить действие)
    (Выполнить действие)
    (Выполнить действие)
    (Выполнить действие)
  );;progn
);;if
Ну и почитайте документацию по применению логических функций
Првильнее будет вместо AND использовать OR точнее для данной ситуации нужно.
mmax вне форума  
 
Непрочитано 25.02.2006, 23:45
#62
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от mmax
Првильнее будет вместо AND использовать OR точнее для данной ситуации нужно.
Если Вы в этом уверены, то покажите как это сочетается с Вашим же требованием
Цитата:
Сообщение от mmax
Мне бы холтелось бы наоборот -- хотябы одно условие не верно -- действие не выполнять
Для себя я мыслю так: действие должно быть выполнено в том случае ЕСЛИ если И первое И второе И третье условия соблюдены

Добавочка:
Цитата:
Сообщение от mmax
Получается, что если хотябы одно условие верно действие выполняется.
Как говорит один мой знакомый, заглянем в Талмуд

Цитата:
progn Function

Evaluates each expression sequentially and returns the value of the last expression

(progn [expr]...)

You can use progn to evaluate several expressions where only one expression is expected.

Arguments
expr
One or more AutoLISP expressions.

Return Values
The result of the last evaluated expression.
Функция (progn) вернет последний результат, то есть, результат проверки последнего условия, а первые два будут попросту проигнорированы.
vk вне форума  
 
Непрочитано 26.02.2006, 01:07
#63
Vika


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


Спасибо всем откликнувшимся, для себя решила, что эффективнее будет пройти курс Автолиспа с преподом. На курсах.
__________________
Muchas gracias, senores!
Vika вне форума  
 
Автор темы   Непрочитано 26.02.2006, 19:37
#64
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от Vika
Спасибо всем откликнувшимся, для себя решила, что эффективнее будет пройти курс Автолиспа с преподом. На курсах.
А учебное пособие всегда должно быть под рукой
mmax вне форума  
 
Автор темы   Непрочитано 26.02.2006, 19:57
#65
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от vk
Цитата:
Сообщение от mmax
хотябы одно условие не верно -- действие не выполнять
Если хотябы одно условие из всех условий не верно

Ситуация 1
Есть n условий:
первое условие не верно
второе верно
третье неверно
пятое верно .............итд --------- (действие не выполнять или отменить и выполнить все заново)

Ситуация2
n услолвий верны ------------ (действие выполнить или продолжить работу программы)

На мой взгляд так надо делать обработку неверного ввода в диалоговое окно, когда например не допускется пустой ввод, 0, итд.
Или объясните как запретить ввод недопустимых данных в edit box
INITGET здесь не (очень) подходит.
mmax вне форума  
 
Автор темы   Непрочитано 26.02.2006, 20:06
#66
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Скажите пожалуйста,

Как нарисовать за один прием много окружностей.

Список с центрами уже почти получен

Количество окружностей задается пользователем и угадать его можно
Но команда отрисовки должна быть одна, в нее надо засунуть список с центрами и одним радиусом.
mmax вне форума  
 
Непрочитано 26.02.2006, 20:36
#67
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


>mmax

Вот, я знал что должна быть функция "or" только в моих источниках , я про нее ничего не нашел. Так она все-таки реализована в Lisp или нет?
favorite вне форума  
 
Непрочитано 26.02.2006, 21:05
#68
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от favorite
Так она все-таки реализована в Lisp или нет?
Если не секрет, что помешало в течении суток заглянуть в хелп по Липу и найти ответ на этот вопрос? :wink:
vk вне форума  
 
Непрочитано 26.02.2006, 21:13
#69
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от mmax
Как нарисовать за один прием много окружностей.

Список с центрами уже почти получен
Так примерно

Код:
[Выделить все]
_$ (setq d 5.0)
5.0
_$ (setq c '((10 20) (30 40) (50 60)))
((10 20) (30 40) (50 60))
_$ (mapcar '(lambda (x) (command "_circle" x d)) c)
(nil nil nil)
_$
vk вне форума  
 
Непрочитано 26.02.2006, 21:15
#70
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Цитата:
Сообщение от vk
Цитата:
Сообщение от favorite
Так она все-таки реализована в Lisp или нет?
Если не секрет, что помешало в течении суток заглянуть в хелп по Липу и найти ответ на этот вопрос? :wink:
Плохое знание англ , я думаю.
favorite вне форума  
 
Непрочитано 26.02.2006, 21:41
#71
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


> favorite
Простите, я в недоумении....

Это насколько же плохое знание английского надо иметь для того чтоб сверяя имя функции из вашего же поста букву за буквой (аж две штуки) с именами функций в списке хелпа....

Признайтесь, Вы шутите :?:
[ATTACH]1140979281.gif[/ATTACH]
vk вне форума  
 
Непрочитано 27.02.2006, 09:51
#72
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


>vk
Позволил себе наглость, немного усовершенствовать предложенный вами лисп, чтоб можно было дальше в программе использовать окружности...
Код:
[Выделить все]
(setq d 5.0)
(setq lst-pt '((10 20) (30 40) (50 60)))
(setq
  lst-ent (mapcar
	    (function
	      (lambda (x)
		(entmakex
		  (list
		    '(0 . "CIRCLE")
		    (cons 10 x)
		    (cons 40 d)
		  ) ;_  list
		) ;_  entmakex
	      ) ;_  lambda
	    ) ;_  function
	    lst-pt
	  ) ;_  mapcar
) ;_  setq
В переменной lst-ent накапливаются имена полученных окружностей...
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 27.02.2006, 18:02
#73
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от favorite
>mmax

Вот, я знал что должна быть функция "or" только в моих источниках , я про нее ничего не нашел. Так она все-таки реализована в Lisp или нет?
Значит так
Расскажу как я реализовал OR.
Код:
[Выделить все]
(setq a 5 b 6 c 7 d 8 e n)
  
   (if  (or (Условие для а)
              (Условие для b)
               (Условие для c)
                (Условие для d)
                 (Условие для e)
                 );or
              (Действие 1)
              (Действие 2)
                   );if
Если хотябы одно условие из всех условий не верно
будет выполнено (действие2) также например если только три условия верны или n-1 условий верно

(Действие 1) будет выполнено если все условия верны

Действия можно объединять с помощью PROGN те если какието условия не верны==> выполнить первые пять действий;
если все верны == выполнить вторые десять действий.

Если вместо or использовать PROGN и AND, то получается ситуация:
если хотябы одно условие верно ===== выполнить (действие 1)
если все не верны ===== выполнить (действие2)

Если действие 2 опущено а по условиям выполняться должно оно, то не выполняется ничего и программа если на этом месте не заканчивается -- продолжается дальше.

Кстати на этом форуме есть кнопки, кроме "цитата" позволяющие автоматически в текстовое окно вводить имена пользователей????? например чтобы щелкнул по имени пользователя и получилось > favorite
mmax вне форума  
 
Автор темы   Непрочитано 27.02.2006, 18:08
#74
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Елпанов Евгений
vk
Спасибо за совет
mmax вне форума  
 
Непрочитано 27.02.2006, 19:29
#75
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от mmax
Расскажу как я реализовал OR.
Код:
[Выделить все]
(setq a 5 b 6 c 7 d 8 e n)
  
   (if  (or (Условие для а)
              (Условие для b)
               (Условие для c)
                (Условие для d)
                 (Условие для e)
                 );or
              (Действие 1)
              (Действие 2)
                   );if
Если хотябы одно условие из всех условий не верно
будет выполнено (действие2) также например если только три условия верны или n-1 условий верно

(Действие 1) будет выполнено если все условия верны
Попробовал сделать по Вашей методике. Написал вот такой код
Код:
[Выделить все]
(setq a 22 b 6 c 7 d 8)

(if (or
      (= a 5)
      (= b 6)
      (= c 7)
      (= d 8)
    )
  (princ "\nДействие 1 \"все условия верны\"")
  (princ "\nДействие 2 \"хотя бы одно условие из всех условий не верно\"")
)
Загрузил из консоли. Пишет
Цитата:
_$

Действие 1 "все условия верны"
; 2 forms loaded from #<editor "<Untitled-0> loading...">
_$
Уважаемый mmax, подскажите в чем дело?
vk вне форума  
 
Непрочитано 27.02.2006, 21:40
#76
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Цитата:
Сообщение от vk
> favorite
Простите, я в недоумении....

Это насколько же плохое знание английского надо иметь для того чтоб сверяя имя функции из вашего же поста букву за буквой (аж две штуки) с именами функций в списке хелпа....

Признайтесь, Вы шутите :?:
[ATTACH]1140979281.gif[/ATTACH]

Да я шучу.
favorite вне форума  
 
Непрочитано 27.02.2006, 21:48
#77
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Помогите при изучении далее возникла проблема

Код:
[Выделить все]
(setq ss1 (ssget ((0. "TEXT"))))
(sslength ss1)
На просьбу выполнить выдается 0.0bad function: 0.0bad function: 0.0bad function: 0.0
Что сдесь не правильно? И зачем перед 0. двойные кавычки.

Вот откуда я это взял http://www.niac.ru/graphinfo.nsf/5f7f2cd00c87d30e432566f9003f057a/fbb061dc26847979432568aa006973a2!OpenDocument
favorite вне форума  
 
Непрочитано 27.02.2006, 21:54
#78
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Ты кавычку забыл скопировать и пробел пропустил...
Код:
[Выделить все]
(setq ss1 (ssget '((0 . "TEXT")))) 
(sslength ss1)
Елпанов Евгений вне форума  
 
Непрочитано 27.02.2006, 22:02
#79
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от Елпанов Евгений
Ты кавычку забыл скопировать и пробел пропустил...
Ничего он не забыл.... На той страничке по ссылке это не единственная ачипятка
Цитата:
Ю.И.Тарасов. Введение в язык АвтоЛИСП

ЛЕКЦИЯ 5
..................................
Пример:
(setq a (open "abc.lsp" "r")
........................
(setq f (open "mytext.txt> "r"))
задает f как <описатель файла>.
...............................

Пример использования <фильтра-списка>:
(setq ss1 (ssget ((0. "TEXT")))) - запрашивает у пользователя выбор примитивов общего вида, однако только текстовые примитивы попадают в набор.
(setq ss1 (ssget "p" ((0. "LINE")))) - создает набор примитивов, входящих в текущий выбор и являющихся отрезками.
vk вне форума  
 
Непрочитано 27.02.2006, 22:02
#80
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Цитата:
Сообщение от Елпанов Евгений
Ты кавычку забыл скопировать и пробел пропустил...
Код:
[Выделить все]
(setq ss1 (ssget '((0 . "TEXT")))) 
(sslength ss1)
Да, я взял их пример и в буфер потом вставил.
Вот и изучай Lisp по инету. Где, я спрашиваю у них кавычка и пробел?
Спасибо.
favorite вне форума  
 
Непрочитано 27.02.2006, 22:05
#81
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Тогда, перед всеми извиняюсь, что на favorite навел напраслину, а vk заставил лезть на сайт и проверять...
Елпанов Евгений вне форума  
 
Непрочитано 28.02.2006, 00:43
#82
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от favorite
Вот и изучай Lisp по инету. Где, я спрашиваю у них кавычка и пробел?
К сожалению, далеко не все что выложено в инете, не содержит ошибок и опечаток. Однако, в хелп кому то трудно заглянуть, чтоб посмотреть правильный синтаксис....
vk вне форума  
 
Автор темы   Непрочитано 28.02.2006, 19:54
#83
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от vk
Пробовал сделать по Вашей методике. Написал вот такой код
Код:
[Выделить все]
(setq a 22 b 6 c 7 d 8)

(if (or
      (= a 5)
      (= b 6)
      (= c 7)
      (= d 8)
    )
  (princ "\nДействие 1 \"все условия верны\"")
  (princ "\nДействие 2 \"хотя бы одно условие из всех условий не верно\"")
)
Загрузил из консоли. Пишет
Цитата:
_$

Действие 1 "все условия верны"
; 2 forms loaded from #<editor "<Untitled-0> loading...">
_$
Уважаемый mmax, подскажите в чем дело?
Действительно,

навреное я устал и меня начало глючить.
Пойду посплю
mmax вне форума  
 
Непрочитано 02.03.2006, 21:54
#84
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Помогите.
Разбирая работу со списками не могу понять как, если у меня в блоке есть текст и еще ряд примитивов как уневерсально, добраться до них.
  • (setq a (ssget))
    (sslength a) ; "Определяет количество примитивов в наборе "
    (setq w (ssname a 0)) ;Вытаскивает n элемент из набора если в наборе несколько элементов
    (terpri)

    (setq r (entget w)) ; Вытаскивает список для выбранного элемента
- В списке несколько примитивов как их вытащить по очереди ?
favorite вне форума  
 
Непрочитано 02.03.2006, 22:15
#85
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


>favorite

"Классические" варианты такие:

Код:
[Выделить все]
(setq Count 0) ; присвоить счётчику начальное значение
(repeat(sslength a) ; повторить по количеству элементов в наборе
  (setq Entity(nth Count a)) ; получить из набора очередной примитив

  ;тут любые действия с очередным примитивом

  (setq Count(1+ Count)) ; увеличить счётчик на 1
  ); end repeat
или

Код:
[Выделить все]
(setq Count 0)
(while(<(sslength a)Count) ;пока счётчик меньше длинны набора
  (setq Entity(nth Count a))

  ;;тут любые действия с очередным примитивом

  (setq Count(1+ Count))
  ); end while
Однако хочется отметить что LISP это язык обработки списков и на практике набор чаще преобразовывают в список, поскольку для обработки списков существует большое количество быстрых функций.

Зачем (terpri) вставил Она служит только для перевода строк при выводе текста.
{Smirnoff} вне форума  
 
Непрочитано 02.03.2006, 22:42
#86
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Наверное я плохо объяснил что мне надо в результате работы моей программы получается
((-1 . <Entity name: 7e202b40>) (0 . "INSERT") (330 . <Entity name: 7e3d3cf8>) (5 . "28D8") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbBlockReference") (2 . "Ïðèìèòèâ") (10 23785.8 22829.1 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))

Фактически мне нужно не перебрать все объекты, а найти имена примитивов в списке <Entity name: 7e3d3cf8>) , чтобы потом функцией
ssget развернуть его и затем подправить.

Задача:
У меня в блоке текст и я хочу до него добраться.
favorite вне форума  
 
Непрочитано 02.03.2006, 23:42
#87
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Цитата:
Задача:
У меня в блоке текст и я хочу до него добраться.
Вот теперь задача сформулирована правильно, она совсем "из другой оперы" и не имеет практически никакого отношения к представленному вами коду.

Описание блока (Block) - находится в таблице "BLOCK" (есть такая форма хранения информации в чертеже). В сам чертёж вставляются только "отражения" этой информации (Block Reference). К примеру найдём в таблице "BLOCK" описание блока с названием "My_Block":
Код:
[Выделить все]
(setq bl(tblsearch "BLOCK" "My_Block"))
Код:
[Выделить все]
((0 . "BLOCK") (2 . "My_Block") (70 . 0) (10 0.0 0.0 0.0) (-2 . <Entity name: 
7ef57ef8>))
Теперь найдём первый примитив в описании блока. Для этого надо выделить данные точечной пары с кодом -2:
Код:
[Выделить все]
 (setq Ent(cdr(assoc -2 bl)))
Для проверки каждого примитива на тип и другие свойства естественно:
Код:
Код:
[Выделить все]
((-1 . <Entity name: 7ef57ef8>) (0 . "LINE") (330 . <Entity name: 7ef57ee0>) (5 
. "97") (100 . "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbLine") (10 -2.86742 
-3.49823 0.0) (11 3.29162 4.01575 0.0) (210 0.0 0.0 1.0))
Для получения следующего примитива существует функция ENTNEXT. Для перебора всех примитивов в блоке надо сделать цикл с условием "пока существует следующий примитив" (это человеческим языком).
Код:
[Выделить все]
(setq Ent(cdr(assoc -2 bl))); получение первого примитива
(while Ent ; пока есть очередной примитив
  (setq Ent(entnext Ent)); получить следующий примитив
(if Ent ; если примитив получен

; ваши действия

); end if  
); end while
Хочу вам также сказать что аналогичные операции проще делать "объектным" (VisualLISP) методом, где всё называется своими именами. Т. е. для получния допустим цвета объекта применяется функция vla-get-color, слоя vla-get-layer и т. д. Но советую пройти школу "обычного" LISP (AutoLISP) до конца, иначе будете слегка "недоделанным".
{Smirnoff} вне форума  
 
Непрочитано 02.03.2006, 23:52
#88
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Огромное спасибо, очень помогли. А то сижу уже несколько дней и никак понять не могу.
Скажите а функцию entnext c ssget использовать нельзя? я правильно понял.
favorite вне форума  
 
Непрочитано 03.03.2006, 00:14
#89
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Цитата:
Скажите а функцию entnext c ssget использовать нельзя? я правильно понял.
Функция ENTNEXT возвращает метки примитивов в том порядке, в котором они находятся в базе данных чертежа или в описании блока, а функция SSGET формирует набор по определённым признакам (см. дополнительные параметры).
Классический пример использования функции ENTNEXT (кроме перебора примитивов в блоке) это сбор объектов после расчленения блоков, мультилиний, размеров (тоже кстати блок). Общий алгоритм такой:
Код:
[Выделить все]
(setq lent(entlast)); получаем поледний неудалённый примитив
(command "_.explode" "My_Block" "") ;"взорвали" блок
Далее идет сбор примитивов появившихся после расчленения блока, начиная от (entnext lent) и до поледнего. Обычно они собираются в новый набор созданный функцией SSADD или просто обрабатываются в вышеприведенном примере цикла.
{Smirnoff} вне форума  
 
Непрочитано 03.03.2006, 00:25
#90
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Кстати если вы более мение прилично читаете по английски (а это просто необходимо для самотоятельного изучения) лучший сайт для обучения AutoLISP это www.afralisp.co.za . Также для получения бесчисленного количества примеров по любой функции, просто заходите на www.google.com и набираете эту функцию в строке поиска. Особенно хороши японские и корейские сайты . Я не шучу, там народ тоже "копает", причём независимо от нас и англоязычных парней. Есть еще один "заповедник" программирования в Autocad www.theswamp.org , там очень сильный контенгент. Хотя думаю что этого сайта и www.autocad.ru впринципе достаточно.
{Smirnoff} вне форума  
 
Непрочитано 03.03.2006, 01:46
#91
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от {Smirnoff}
Классический пример использования функции ENTNEXT (кроме перебора примитивов в блоке) это сбор объектов после расчленения блоков, мультилиний, размеров (тоже кстати блок)...
Осколки после взрыва можно собрать (ssget "_P") , кажется проще.
vk вне форума  
 
Непрочитано 03.03.2006, 08:06
#92
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Цитата:
Осколки после взрыва можно собрать (ssget "_P") , кажется проще.
В общем то да, но в этом случае требуется проверка - а получилось ли взорвать? Иначе можно получть совсем не тот набор.
Да и не всегда нужен набор, иногда нужно просто обработать что-то по одному примитиву. Так что и то и другое хорошо в своём случае
{Smirnoff} вне форума  
 
Непрочитано 03.03.2006, 08:12
#93
Кулик Алексей aka kpblc
Moderator

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


Если надо добраться до элементов описания блока (без взрывания), можно попробовать такое:
Код:
[Выделить все]
(defun _kpblc-block-get-content	(block-name / adoc res)
  (vl-load-com)
  (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  (if (tblobjname "block" block-name)
    (vlax-for item (vla-item (vla-get-blocks adoc) block-name)
      (setq res (append res (list item)))
      ) ;_ end of vlax-for
    ) ;_ end of if
  res
  ) ;_ end of defun
Вернет список vla-указателей на примитивы, входящие в блок либо nil, если имя запрашиваемого блока не содержится в чертеже.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.03.2006, 09:37
#94
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


>kpblc
Да это просто прорыв в программировании!

Шучу, не обижайся. Тут просто ребята пока элементарные вопросы задают, не нужОн им пока Visual (сугубо личное мнение).
{Smirnoff} вне форума  
 
Непрочитано 03.03.2006, 09:51
#95
Кулик Алексей aka kpblc
Moderator

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


> {Smirnoff} : Шутку понял
Просто мне, например, оказалось проще работать через vla-функции - вот и пропагандирую их где ни попадя
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.03.2006, 10:36
#96
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Цитата:
Сообщение от kpblc
> {Smirnoff} : Шутку понял
Просто мне, например, оказалось проще работать через vla-функции - вот и пропагандирую их где ни попадя
Вот и посылай таким умнык книжки - ОК, инфу об умных книжках - на чвою голову...
Лентяй вне форума  
 
Непрочитано 03.03.2006, 10:55
#97
Кулик Алексей aka kpblc
Moderator

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


Лентяй, Лентяй... Я ж отлично помню всех, кто мне помогал. Если перечислять начну, я ж работать не буду дня два, не меньше!
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.03.2006, 18:29
#98
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Господа, подскажите, как сохранить в переменной имена всех слоев текущего рисунка для передачи их в раскрывающийся список диалогового окна DCL, где пользователю предлагается выбрать один из имеющихся слоев.

Можно получить хотябы даже список с неужными элементами(тип линий, стиль печати), этих ненужных элементов я уже научился выбрасывать из списков.

Проблема эта вызвана тем, что я не могу угадать какой слой использует пользователь для рисования допустим осевых линий, поэтому я решил предоставить пользователю выбрать самому выбрать слой для того или иного типа линий.
mmax вне форума  
 
Непрочитано 03.03.2006, 19:10
#99
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


например так можно получить список слоев:
Код:
[Выделить все]
(defun test (/ layers_lst)
  (vlax-for i
	      (vla-get-layers
		(vla-get-ActiveDocument (vlax-get-acad-object))
	      )
    (setq layers_lst (cons (vla-get-name i) layers_lst))
  )
  (reverse layers_lst)
)
;;;(test)
Apelsinov вне форума  
 
Непрочитано 03.03.2006, 20:15
#100
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Цитата:
Сообщение от kpblc
Если надо добраться до элементов описания блока (без взрывания), можно попробовать такое:
Код:
[Выделить все]
(defun _kpblc-block-get-content	(block-name / adoc res)
  (vl-load-com)
  (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  (if (tblobjname "block" block-name)
    (vlax-for item (vla-item (vla-get-blocks adoc) block-name)
      (setq res (append res (list item)))
      ) ;_ end of vlax-for
    ) ;_ end of if
  res
  ) ;_ end of defun
Вернет список vla-указателей на примитивы, входящие в блок либо nil, если имя запрашиваемого блока не содержится в чертеже.
ДА......!!!!! Это очень сложно для меня даже понять о чем реч идет не могу . :cry:

Подскажите пытаюсь текст в блоке заменить что-то не получается скажите где я не прав.

Код:
[Выделить все]
(setq a (tblsearch "Block" "RRR"))
(setq b (cdr(assoc -2 a)))
(setq Bsp1 (entget b))
(setq OLD (cdr(assoc 1 Bsp1)))
(setq New (subst "ПРОБА" old BSp1))
(entupd a)
favorite вне форума  
 
Непрочитано 03.03.2006, 21:18
#101
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от {Smirnoff}
Цитата:
Осколки после взрыва можно собрать (ssget "_P") , кажется проще.
В общем то да, но в этом случае требуется проверка - а получилось ли взорвать?
Та же проверка с (entlast) сойдет. Возможно, (vl-cmdf) удастся использовать для этого, однако, последнее не проверял.
vk вне форума  
 
Автор темы   Непрочитано 03.03.2006, 21:23
#102
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от Apelsinov
например так можно получить список слоев:
Код:
[Выделить все]
(defun test (/ layers_lst)
  (vlax-for i
	      (vla-get-layers
		(vla-get-ActiveDocument (vlax-get-acad-object))
	      )
    (setq layers_lst (cons (vla-get-name i) layers_lst))
  )
  (reverse layers_lst)
)
;;;(test)
Вот только возвращает веселый список

Код:
[Выделить все]
("Слой6" "Слой5" "Слой4" "Слой3" "Слой2" "Слой1" "0" "Слой6" "Слой5" "Слой4" "Слой3" "Слой2" "Слой1" "0" "Слой6" "Слой5" "Слой4" "Слой3" "Слой2" "Слой1" "0" "Слой6" ("Слой5" ("Слой4" ("Слой3" ("Слой2" ("Слой1" ("0" ("Слой6" "Слой5" "Слой4" "Слой3" "Слой2" "Слой1" "0" (vla-get-Name I) LAYERS_LST))))))))
это один из вариантов, а так каждый раз возвращает по разному те разная очередность элементов и разное количество

из такого неустойчивого списка будет сложновато отбросить лишние элементы

А нельзя как нибудь не используя АктивХ извлекать имена.
Я например до использования этой функции пытался зациклить TBLNEXT, пока безрезультатно.
mmax вне форума  
 
Непрочитано 03.03.2006, 21:43
#103
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от mmax
Вот только возвращает веселый список

Код:
[Выделить все]
("Слой6" "Слой5" "Слой4" "Слой3" "Слой2" "Слой1" "0" "Слой6" "Слой5" "Слой4" "Слой3" "Слой2" "Слой1" "0" "Слой6" "Слой5" "Слой4" "Слой3" "Слой2" "Слой1" "0" "Слой6" ("Слой5" ("Слой4" ("Слой3" ("Слой2" ("Слой1" ("0" ("Слой6" "Слой5" "Слой4" "Слой3" "Слой2" "Слой1" "0" (vla-get-Name I) LAYERS_LST))))))))
это один из вариантов, а так каждый раз возвращает по разному те разная очередность элементов и разное количество
За последние несколько лет, Вам первому удалось обнаружить столь странный глюк этого кода. Есть уверенность, что все без ошибок скопировано?
vk вне форума  
 
Непрочитано 03.03.2006, 21:49
#104
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от favorite
Подскажите пытаюсь текст в блоке заменить что-то не получается .....
В наипростейшем случае (в блоке "rrr" только TEXT) что то вроде такого
Код:
[Выделить все]
(setq a (tblsearch "Block" "RRR"))
(setq b (cdr(assoc -2 a)))
(setq Bsp1 (entget b))
(entmod (subst '(1 . "Новый текст") (assoc 1 Bsp1) BSp1))
Ну и _.regenall потом....
vk вне форума  
 
Непрочитано 03.03.2006, 22:06
#105
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Так поступают все гуры
Код:
[Выделить все]
(defun C:BlkTxtRpl ( / adoc bks util blk bn str)
  (vl-load-com)
  (setq adoc (vla-get-ActiveDocument (vlax-get-acad-object))				;Активный тугамент
	    bks (vla-get-blocks adoc)							;Список блоков в активном тугаменте
	    util (vla-get-utility adoc))							;Хваталка объектов
  (setq bn (vla-getString util t "\Enter Block Name or <Enter> to Select: "))		;Ну, это и так понятно
  (if (= bn "") (progn (vla-getEntity util 'blk nil) (setq bn (vla-get-name blk))))	;Хватаем блок из чертежа
  (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-item (list bks bn)))		;Не наврано ли имя блока
    (setq blk (vla-item bks bn)))							;Тащим блок из списка
  (vlax-for ent blk									;Вытаскиваем елементы блока по очереди
    (if (or (= (vla-get-objectname ent) "AcDbText")					;Проверка на текстность...
	    (= (vla-get-objectname ent) "AcDbMText"))					;и мультитекстность
      (if (/= "" (setq str (vla-getString util t
			     (strcat "\Enter New text: <"(vla-get-TextString ent)">"))))       ;Вывод существующего текста
	(vla-put-textString ent str))))							;Замена текста
);end
Лентяй вне форума  
 
Непрочитано 03.03.2006, 22:57
#106
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от Лентяй
Так поступают все гуры...
Точно? :wink:

Код:
[Выделить все]
(defun C:BlkTxtRpl (/ adoc bks util blk bn str)
  (vl-load-com)
  (setq adoc (vla-get-ActiveDocument (vlax-get-acad-object))
                                        ;Активный тугамент 
        bks  (vla-get-blocks adoc)      ;Список блоков в активном тугаменте 
        util (vla-get-utility adoc)
  )                                     ;Хваталка объектов 
  (setq
    bn (vla-getString util t "\Enter Block Name or <Enter> to Select: ")
  )                                     ;Ну, это и так понятно 
  (if (= bn "")
    (progn (vla-getEntity util 'blk nil) (setq bn (vla-get-name blk)))
  )                                     ;Хватаем блок из чертежа 
  (if (vl-catch-all-error-p
        (setq blk (vl-catch-all-apply 'vla-item (list bks bn)))
      )
                                        ;Не наврано ли имя блока
    (alert "Ошибка получения блока!")
    (vlax-for ent blk                   ;Вытаскиваем елементы блока по очереди 
      (if (or (= (vla-get-objectname ent) "AcDbText")
                                        ;Проверка на текстность... 
              (= (vla-get-objectname ent) "AcDbMText")
          )                             ;и мультитекстность 
        (if (/= ""
                (setq str (vla-getString
                            util
                            t
                            (strcat "\Enter New text: <"
                                    (vla-get-TextString ent)
                                    ">"
                            )
                          )
                )
            )                           ;Вывод существующего текста 
          (vla-put-textString ent str)
        )
      )
    )                                   ;Замена текста
  )
  (vla-Regen adoc acAllViewports)
)                                       ;end
* Только избавление от фатальных ошибок
Alaspher вне форума  
 
Непрочитано 03.03.2006, 23:24
#107
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Даааааа Многому мне еще предстоит научиться!
А скажите если я создам блок в котором будут аттрибуты, затем расставлю эти блоки на чертеже. Можно ли зделать программу которая в каждом блоке будет изменять аттрибут на нужное мне значение.
Например нумерация свай.???? :?:
favorite вне форума  
 
Автор темы   Непрочитано 03.03.2006, 23:31
#108
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от favorite
Даааааа Многому мне еще предстоит научиться!
:?:
Да, мне тоже.

Кстати вопрос к профессионалам.
Без АктивХ можно использовать Автокад на полную мощность?
mmax вне форума  
 
Непрочитано 03.03.2006, 23:36
#109
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от favorite
если я создам блок в котором будут аттрибуты, затем расставлю эти блоки на чертеже. Можно ли зделать программу которая в каждом блоке будет изменять аттрибут на нужное мне значение.
Например нумерация свай.???? :?:
Если будут выработаны непротиворечивые формализованые правила таких изменений, то сам код накидать - дело техники.

Цитата:
Сообщение от mmax
Без АктивХ можно использовать Автокад на полную мощность?
ActiveX добавляет ряд важных возможностей в API Autocad. Для разработчика это очень ценно, а для юзера - всё равно, каким механизмом решается его задача.
Alaspher вне форума  
 
Автор темы   Непрочитано 03.03.2006, 23:52
#110
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от vk
Цитата:
Сообщение от mmax

Код:
[Выделить все]
("Слой6" "Слой5" "Слой4" "Слой3" "Слой2" "Слой1" "0" "Слой6" "Слой5" "Слой4" "Слой3" "Слой2" "Слой1" "0" "Слой6" "Слой5" "Слой4" "Слой3" "Слой2" "Слой1" "0" "Слой6" ("Слой5" ("Слой4" ("Слой3" ("Слой2" ("Слой1" ("0" ("Слой6" "Слой5" "Слой4" "Слой3" "Слой2" "Слой1" "0" (vla-get-Name I) LAYERS_LST))))))))

все без ошибок скопировано?
Без ошибок
просто я вместо (test) переменную LAYERS_LST тыркал, вот и чесал голову.

Огромное спасибо Apelsinovу за предоставленую информацию.

Вопрос к гуру(ам) сколько времени требуется чтобы основательно все изучить, понять и применять знания не обращаясь за помощью к другим.

Слышал что ЛИСП умирает и получится так что я его изучил, а он уже в гробу лежит и Билл Гейтс последний гвоздь в крышку заколачивает.
mmax вне форума  
 
Непрочитано 03.03.2006, 23:54
#111
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Цитата:
Сообщение от Alaspher
Цитата:
Сообщение от Лентяй
Так поступают все ...
Точно? :wink:
Мне что, следовало написать - "настоящие гуры"?
Лентяй вне форума  
 
Непрочитано 03.03.2006, 23:56
#112
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Цитата:
Сообщение от favorite
Даааааа Многому мне еще предстоит научиться!
А скажите если я создам блок в котором будут аттрибуты, затем расставлю эти блоки на чертеже. Можно ли зделать программу которая в каждом блоке будет изменять аттрибут на нужное мне значение.
Например нумерация свай.???? :?:
Я тут как-то выкидывал соотв. лиспу, KAN называлась.
Лентяй вне форума  
 
Непрочитано 04.03.2006, 00:06
#113
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от mmax
Слышал что ЛИСП умирает и получится так что я его изучил, а он уже в гробу лежит и Билл Гейтс последний гвоздь в крышку заколачивает.
А я каждый год слышу, что Винде осталось, от силы, полгода быть ОСью нумба уан... и что? Кто выглядит лучше, те, кто говорят или те, кто эти продукты делает? Только клинический идиот может позволить себе такой фортель, как отказ от AutoLISP. В руководстве Autodesk, появление таковых крайне маловероятно.

Цитата:
Сообщение от Лентяй
Мне что, следовало написать - "настоящие гуры"?
Эт' вам, гурям - виднее...
Alaspher вне форума  
 
Непрочитано 04.03.2006, 00:39
#114
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от mmax
просто я вместо (test) переменную LAYERS_LST тыркал, вот и чесал голову.
Подозреваю, что переменная LAYERS_LST была не локализованой, что в ней накопилось столько дряни
vk вне форума  
 
Непрочитано 04.03.2006, 16:04
#115
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Вопрос в почему в справке Vlisp я не могу найти написание таких функций как "_.insert" и "_.regenall" и что означает "_."?

(command "_.regenall")-здесь еще нужны какие-то параметры?
Код:
[Выделить все]
(setq a (tblsearch "Block" "RRR"))
(setq b (cdr(assoc -2 a)))
(setq Bsp1 (entget b))
(setq OLD (assoc 1 Bsp1))
(setq New (subst '(1 . "ïîëó÷èëîñü") OLD  BSp1))
;(entupd a)
(command "_.regenall")
Я зделал как написали мне выше но не работает .
Что не так? Объясните
favorite вне форума  
 
Непрочитано 04.03.2006, 16:51
#116
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от favorite
Вопрос в почему в справке Vlisp я не могу найти написание таких функций как "_.insert" и "_.regenall"
Потому что это не функции а команды АКАДа. Учите матчасть.
Цитата:
Сообщение от favorite
и что означает "_."?
Подчерк - означает игнорировать локализацию АКАДа, использовать оригинальное английское имя команды. Точка - использовать оригинальную версию команды, если команда была переопределена при помощи Лиспа.

Цитата:
Сообщение от favorite
(command "_.regenall")-здесь еще нужны какие-то параметры?
Учитывая что _.regenall это команда, ответ на этот вопрос легко ищется в хелпе. Можно также набрать команду с клавиатуры и посмтреть, будут ли задаваться дополнительные вопросы.


Цитата:
Сообщение от favorite
Код:
[Выделить все]
(setq a (tblsearch "Block" "RRR"))
(setq b (cdr(assoc -2 a)))
(setq Bsp1 (entget b))
(setq OLD (assoc 1 Bsp1))
(setq New (subst '(1 . "ïîëó÷èëîñü") OLD  BSp1))
;(entupd a)
(command "_.regenall")
Я зделал как написали мне выше но не работает .
Что не так? Объясните
Прочтите и сравните по буквам или по функциям, как написали выше с тем что опубликовано здесь.
vk вне форума  
 
Автор темы   Непрочитано 11.03.2006, 13:12
#117
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Господа, подскажиете такую вещь.

Насколько я понимаю LISP - приложение нельзя внедрить в Файл рисунка, а очень бы хотелось чтобы программа выполнялась при открытии документа; acaddoc.lsp acad.lsp и автозагрузка здесь не катят тк программа должна выполняться на чужом компьютере.

Скажите пожалуйста как на VBA создать внедренный макрос который бы выполнил лисп функцию (load "plot.lsp") те при открытии рисунка появляется сообщение с кнопками Да Нет если нажать да то выполнится лисп функция

Связано это с тем, что печать на плоттере я осуществляю в фирмах, предоставляющих такую услугу, и мне уже надоело объяснять работникам фирмы, что формат А1 в на листе 620*940 разместится в масштабе 1:1 без вписывания, а они утверждают обратное -- типа ихние плоттеры имеют меньшую площадь печати чем формат А1 и умудряются вписывать формат с уменьшением масштаба в такую обширную площадь печати, что недопустимо для машиностроительных чертежей, к настройке печати они меня не допускают и моих советов не слушают тк считают ниже своего достоинства давать настраивать печать какомуто студенту.

Тк мои познания автокада в последнее время несколько расширились и дрова плоттера установлены на моем компьютере, то печать я могу настраивать дома, и уменя все получается.
mmax вне форума  
 
Автор темы   Непрочитано 14.03.2006, 19:23
#118
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Уважаемые господа, получил списки

Код:
[Выделить все]
((10 1165.89 805.692) (10 1165.89 652.957) (10 1318.62 652.957) (10 1318.62 805.692))

((11 1177.2 794.379) (11 1177.2 664.271) (11 1307.31 664.271) (11 1307.31 794.379)) 
_$
а соответствующие линии(LINE) ни ENTMAKE .
Уж я их и переворачивал и объединял и чего только не делал а они всеравно ни ENTMAKE.

Количество элементов в списках зависит от нужд пользователя. Начала и концы линий соответствуют правилу:
Для первой первые элементы обоих списков
Для второй вторые
Для третьей третьи
ИТД

Это из моей программы для рисования фланца. Фланец уже рисуется, а осевые не проставляются, списки приведенные выше – координаты осевых для крепежных отверстий .
mmax вне форума  
 
Непрочитано 14.03.2006, 19:50
#119
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от mmax
а они всеравно ни ENTMAKE.
Что то туго с телепатией сегодня. Проблемный кусок кода где?
vk вне форума  
 
Непрочитано 14.03.2006, 19:54
#120
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Код:
[Выделить все]
(mapcar
  (function
    (lambda (a b)
      (entmakex
        (list
          '(0 . "LINE")
          a
          b
        ) ;_  list
      ) ;_  entmakex
    ) ;_  lambda
  ) ;_  function
  '((10 1165.89 805.692) (10 1165.89 652.957) (10 1318.62 652.957) (10 1318.62 805.692))
  '((11 1177.2 794.379) (11 1177.2 664.271) (11 1307.31 664.271) (11 1307.31 794.379))
) ;_  mapcar
Елпанов Евгений вне форума  
 
Непрочитано 14.03.2006, 20:34
#121
pyatifan


 
Регистрация: 29.10.2005
Нижегородская обл.
Сообщений: 219
<phrase 1=


Цитата:
Сообщение от mmax
печать я могу настраивать дома, и уменя все получается.
Неужели PC3 файл не в силах помочь...
pyatifan вне форума  
 
Автор темы   Непрочитано 14.03.2006, 20:35
#122
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от vk
Цитата:
Сообщение от mmax
а они всеравно ни ENTMAKE.
Что то туго с телепатией сегодня. Проблемный кусок кода где?
В том то и дело,что нету кода тоесть было много кодов, но все они были полным бредом, есть только списки, и ничего с ними не получается.
Попробуем завтра, что нам Елпанов Евгений предложил.
mmax вне форума  
 
Непрочитано 15.03.2006, 09:38
#123
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от mmax
Попробуем завтра, что нам Елпанов Евгений предложил.
А чего пробовать...
Функция строит линии и возвращает список указателей на построенные линии.
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 15.03.2006, 19:32
#124
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от pyatifan
Цитата:
Сообщение от mmax
печать я могу настраивать дома, и уменя все получается.
Неужели PC3 файл не в силах помочь...
Может но только кгто даст мне его скопировать в такую длинную директорию.

В лисп функции будет предусмотрено копирование этого файла в нужное место и последующе его удаление, а также будут заданы нужные мне параметры печати и автоматический запуск печати.

Вот только надо сделать так чтобы функция выполнилась сама при открытии рисунка, но лисп здесь безсилен должен помочь VBA.
mmax вне форума  
 
Непрочитано 15.03.2006, 19:55
#125
Zouss


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


все же обьясни, что мешает положить acaddoc.lsp с
Код:
[Выделить все]
(defun s::startup
в ту папочку где лежит твое файло, подготовленное для печати?
Zouss вне форума  
 
Непрочитано 15.03.2006, 20:45
#126
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


>mmax
Цитата:
они утверждают обратное -- типа ихние плоттеры имеют меньшую площадь печати чем формат А1 и умудряются вписывать формат с уменьшением масштаба в такую обширную площадь печати, что недопустимо для машиностроительных чертежей

1)Что тебе мешает настроить layout под нужный лист без полей если у тебя есть драйвера ИХ плоттера? Им надо будет просто нажать на кнопку "печать".

2) И кто заставит их запустить макрос, если ты его сможешь написать, если не проходит даже первый вариант?
Apelsinov вне форума  
 
Непрочитано 16.03.2006, 09:53
#127
VVA

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


>favorite № 107
По сваям см. здесь

Последний раз редактировалось VVA, 18.09.2015 в 23:42.
VVA вне форума  
 
Автор темы   Непрочитано 16.03.2006, 13:51
#128
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от Apelsinov
1)Что тебе мешает настроить layout под нужный лист без полей если у тебя есть драйвера ИХ плоттера? Им надо будет просто нажать на кнопку "печать".
Мешает параметр страницы который у них не настроен. Они используют драйвер который поставляется на дике с Автокадом "HP Designet 450 (A1)" -- это я у них выяснил.
Если рассказать детально, то есть такая папка "Принтеры и факсы" в "Панели управления" там можно настроить размеры листа. По умолчанию там предлагается целый набор стандартных листов ,штук 50, размеры которых нельзя изменить, но есть 5 листов под названием Custom 1, 2, итд, размеры которых можно менять если принтер эти размеры поддерживает, но по умолчанию они имеют стандартные размеры. Беда в том что работники фирмы даже не подозревают что размеры листа можно менять. Они используют листы размером 620*940, а при печати выбирают лист "ISO A1 oversais" -- соответственно принтер тоже думает что у него стоит стандартный формат А1 и расчитывает его с полями для этого формата и глюк еще в том что хоть и "ISO A1 oversais" предусматривает печать без полей, поля по 5 мм всетаки есть--про калибровку работники фирмы тоже не догадываются. Впринципе если печатать без рамки 841*594, то чертеж более менее соответствует масштабу, но лишние края обрезать приходится ножницами и мне эту рамку приходится рисовать карандашом чтобы было видно где резать(напоминаю -- реальные размеры листа 620*940).
Если я у себя на компьютере настрою размеры листа Custom 1 в соответствии с реальными размерами листа 620*940 то в пространстве листа область печати получается много больше чем формат А1 и рамка 841*594 болтается там как гвоздь в стакане. Но когда я приношу рисунок на печать то Автокад выдает сообщение на несоответствие настроек листов в принтере, тоесть надо заставить фирму тоже настроить Custom 1 по моим требованиям.
.PC3 файл мог бы решить решить эту проблему. Как я заметил если в нем вызвать окно настроек принтера, такое же как и в папке "Принтеры и факсы" и задать нужные значения листов, то эти изменения сохранятся только в PC3 и никак не влияет на системные настройки в "Принтерах и факсах", что очень бы порадовало бы фирмачей, которые не хотят отступать от умолчаний ни на шаг. Но этот РС3 предательски отображается в списке принтеров при настройке печати и раздражает пугливых работников.

Цитата:
Сообщение от Apelsinov
2) И кто заставит их запустить макрос, если ты его сможешь написать, если не проходит даже первый вариант?
Я не знаю бейсика и в моем понятии внедренный макрос должен не только загружаться но и выполняться сам. Бесплатные цифровые подписи можно получить у Офиса запустив "C:\Program Files\Microsoft Office\Office10\SELFCERT.EXE". Такая подпись конечно не остановит систему безопасности, но выдаст сообщение что макрос подписан.
А проехать по ушам работников, что этот макрос запускает какую нибудь автоматическую прорисовку стандартных объектов и типов линий , которые хранятся lsp файле, а также запускает печать с нужными параметрами. Для наглядности еще дома отключить все слои, а лисп-функция их включит, получится что не запустив макрос – рисунок будет голым то и печатать его нет смысла, а я всетаки постоянный клиент итп итд.

Чем вызвана эта проблема в целом:
Фирмы по оказанию услуг печати больших форматов для населения просто боятся простоев оборудования по причине сбоев программного и аппаратного обеспечения тк это их хлеб. И клиентов они не подпускают к настройкам потомучто боятся, что клиент в силу своей неопытности может внести какиенибудь изменения и просто чего нибудь напортачить, и после неумелых действий клиента их могут ждать сбои, простои итп. А обучить работников предприниматели просто не могут – таким вещам нигде не учат.
В сложившейся ситуации мой PC3 был бы революционным решением в деятельности фирмы – теперь они могли бы говорить, что формат А1 полностью вписывается в лист без искажений, но мысль о том что какой то файл предоставленный клиентом да еще который надо скопировать в скрытую системную папку да еще какая то там Панель управления приводит их в ужас. И то что я предлагал хозяевам фирм бесплатно обучить персонал использованию РС3 не возымело на них никакого действия. Поэтому мне надо самому для себя принимать какие нибудь революционные решения иначе мои чертежи будут печататься в формате 835*589 а линию отреза полей мне приходится рисовать самому.

Такую политику ведут все фирмы в нашем городе
mmax вне форума  
 
Автор темы   Непрочитано 16.03.2006, 14:06
#129
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от Zouss
все же обьясни, что мешает положить acaddoc.lsp с
Код:
[Выделить все]
(defun s::startup
в ту папочку где лежит твое файло, подготовленное для печати?
Вэтом вопросе я не просящен. Я только знаю что лисп функцию надо записывать acaddoc.lsp который лежит в папке системы автокад, тогда эта функция выполнится при открытии, но на чужом компьютере мне не дадут туда ничего писать.

Сколько мне приходится их уговаривать, спорить чтобы они сделали все по моему все безрезультатно учитывая то что с листа они берут по 100р, а мои требования к печати не выполняют.
однажды просто сказали: "Молодой человек, если вы умнее нас, то купите свой плоттер и печатайте как вам вздумается."
В такие моменты мне хочется написать чтонибудь типа
(vl file delete "systemroot\*.*) :twisted:
mmax вне форума  
 
Автор темы   Непрочитано 16.03.2006, 14:23
#130
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
acaddoc.lsp с
Код:
[Выделить все]
(defun s::startup
в ту папочку где лежит твое файло, подготовленное для печати?
Действительно, а я тут VBA мучаю. Кстати оно почемуто в моем 2005 официальном русском очень глючное и какоето недопереведенное на русский язык хотя в документации сказано что он полностью на английском.
mmax вне форума  
 
Непрочитано 16.03.2006, 16:14
#131
Zouss


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


в обчем маленький ликбез

в acade с недавних пор 4 автозагружаемых лиспа:

acad2000.lsp - системный, загружается при старте системы
acad2000doc.lsp - системный, каждый раз загружается при открытии или создании нового файла
acad.lsp - пользовательский, загружается при старте системы
acaddoc.lsp - пользовательский, каждый раз загружается при открытии или создании нового файла

так вот, acad загрузит один ближайший acaddoc.lsp, а искать будет прежде всего в той папке, где лежит файл чертежа, и только потом, если не найдет, начнет рыть во всяких support file searh path, по порядку причем...

Код:
[Выделить все]
(defun s::startup ()
  ;;;здесь будет нежное тело её
)
автоматически запустится и отработает (если конечно код правыльный ) при loade любого лиспа

дерзайте...
Zouss вне форума  
 
Непрочитано 16.03.2006, 16:43
#132
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


Цитата:
Сообщение от mmax
ISO A1 oversais" предусматривает печать без полей, поля по 5 мм всетаки есть
У меня нет. Сколько печатаю - все точно и без полей. Я так и не понял, зачем при печати на СТАНДАРТНЫЙ А1 устанавливать custom формат листа. Я печатаю на стадартном формате "Oversize: ISO A1" с масштабом 1:1 лист c рамкой точно 841х594 (плоттер HP500). Действительно, ширина рулона больше 594 и к тому-же плоттер обрезает его, отступая какое-то расстояние - ну и что? Даже , если Вам зачем-то надо получившиеся поля обезать - режте по наружней рамке - зачем карандашем что-то рисовать?
Apelsinov вне форума  
 
Автор темы   Непрочитано 16.03.2006, 18:37
#133
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от Apelsinov
Цитата:
Сообщение от mmax
ISO A1 oversais" предусматривает печать без полей, поля по 5 мм всетаки есть
У меня нет. Сколько печатаю - все точно и без полей. Я так и не понял, зачем при печати на СТАНДАРТНЫЙ А1 устанавливать custom формат листа. Я печатаю на стадартном формате "Oversize: ISO A1" с масштабом 1:1 лист c рамкой точно 841х594 (плоттер HP500). Действительно, ширина рулона больше 594 и к тому-же плоттер обрезает его, отступая какое-то расстояние - ну и что? Даже , если Вам зачем-то надо получившиеся поля обезать - режте по наружней рамке - зачем карандашем что-то рисовать?
Вот так будет распечатан чертеж А1 по моему "Custom# 620*940"

:?: Не могу прикрепить картинку средствами этого форума :?:
Эта картинка расположена в Череповецкой локальной городской сети и может быть недоступна некоторым пользователям.



При "Oversize: ISO A1" он будет без наружных рамок и чтобы обрезать лист ножницами надо будет самому нарисовать наружную рамку. Обрезать надо для тогочтобы сложить лист в курсовик и излишние поля только помешают. И как я уже говорил выше меня не допускают к настройкам печати даже если я сделаю чтото неправильно и за повторную печать заплачу как за два листа и при всем этом они умудряются вписать А1 формат с уменьшением масштаба в этот злополучный "Oversize: ISO A1"
Ну и насколько я изучил печать не имея плоттера, а только его драйвер, то в "Oversize: ISO A1" я смогу добиться масштаба 1:1, но наружные рамки могут не пропечататься тк находятся на самом краю печатного края точнее совпадают с ним. Плоттер ничего не режет.

Так что Custom всетаки лучше и реальнее отображает картину.
Ну и при открытии рисунка печать пойдет сама не надо будет ничего настраивать. Вобщем хочу создать этакого печатного троянца который будет действовать по моим правилам а не по ихним.

Ну и в продожение темы нашел тут нечто такое под названием PLOTSETTINGS, которое размещается в секции OBJECTS, а так же список DXF кодов к ним. На мой взгляд с помощью этого PLOTSETTINGS можно настроить печать лучше и прощще чем с помощью COMMAND. Но при помощи моих знаний объектной модели я так и не смог получить возвращаемого значения с кодом ((0 . "PLOTSETTINGS") (итд) (итп))
Скажите как воспользоваться данным свойством, модифицировать его и отправить на печать.
mmax вне форума  
 
Непрочитано 16.03.2006, 19:38
#134
Zouss


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


to mmax

что то ты совсем отчаялся если такой обходной путь ищешь...
Plotsettings - это pagesetup, для каждого layout и для модели эта группа будет... Так вот, чтобы получить ((0 . "PLOTSETTINGS") надо сначала получить ((0 . "имянужногоLayout") а уже затем из этого составного объекта можно выдернуть ((0 . "PLOTSETTINGS") и все остальное Ежели хочешь погеморроиться поищи в хелпе акада на тему Creating & modifying complex entities

соответственно возникают еще два вопроса
1 лирический - вот я в свое время защищался так преподы нас с масштабом не прессовали - аппаратные ограничения, понимали блин...
2 практический - что мешает дома отпечатать в файл *.pln со всеми нужными настройками, а в фирме просто скопировать это дело на плоттер? при такой процедуре все без спросу работает

а вообще ищи нормальную контору с нулевочкой или рулонной A1 - никто ведь не запретит расположить лист на плоттере вертикально?
Zouss вне форума  
 
Непрочитано 17.03.2006, 00:54
#135
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


>mmax

Собственно создание чертежей для плотера которого нет не представляет большой проблемы, при одном условии. Надо иметь файлы шаблонов *.dwt созданные для этого плотера (естественно с рамками, потому что при отсутствии плотера невидно границ листа). При нестандарных форматах это кречно не спасает, однако со стандарными очень помогает.

>Zouss

Без обид.
Писать определние параметров печати в s::startup - вредный совет - поскольку если эта функция переопределена, то работает при загрузке всех чертежей в данном сеансе, т. е. получается что при загрузке её из одной из копий acaddoc.lsp я на весь сеанс работы получаю измененение параметров печати во всех открываемых чертежах :evil:
Если уже на то пошло, не проще ли просто после тела функции в файле acaddoc.lsp сразу её вызвать (defun My_Fun() ...) (My_Fun) ?

Копии acaddoc.lsp конечно в опрелённых случаях выход, но что то мне не совсем нравится. Если такая копия будет случайно перемещеня не в "свою" папку и будет что то творить при открытии чертежей? Большинство контор даже не имеют специалиста который сможет догадатся о причинах подобных "глюков".

Насчёт параметров печати, то их намного проще менять ActiveX - методами.
{Smirnoff} вне форума  
 
Непрочитано 17.03.2006, 09:58
#136
Zouss


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


Цитата:
Сообщение от {Smirnoff}
Если уже на то пошло, не проще ли просто после тела функции в файле acaddoc.lsp сразу её вызвать (defun My_Fun() ...) (My_Fun) ?
еще проще и функцию не определять - сразу код и все отработает само. только как то все это неэлегантно... или несоблюдение стандартов если хотите. Так что я предпочитаю s::startup - и через много лет можно сообразить что в данной проге это автостарт

а для нашего конкретного случая - простая проверка, например на наличие специфических блоков в файле или еще как нибудь вполне достаточна чтобы избежать возможных проблем

собсна я и не обижаюсь - все что я хотел, так это показать самый примитивный, а значит легко и быстро реализуемый способ автозапуска lsp на чужой машине
Zouss вне форума  
 
Непрочитано 17.03.2006, 10:07
#137
Кулик Алексей aka kpblc
Moderator

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


Насколько я знаю, применение S::Startup чревато некорректной работой AutoCAD - порядок вызова этой функции неопределен, и она может вызываться до момента загрузки всех необходимых модулей (lsp и arx) AutoCAD. Т.е. можно получить необъяснимый глюк нормально работающего кода.
Никто не мешает своему коду дать имя нечто типа
Код:
[Выделить все]
(defun zouss:loader())
либо
Код:
[Выделить все]
(defun zouss:starter())
В общем, на выбор. А в acaddoc.lsp уже вызывать именно это имя и именно тогда, когда это надо.
По крайней мере, я бы сделал так.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.03.2006, 11:19
#138
Zouss


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


все же продолжаю оставаться при своем мнении, и вот почему

порядок вызова s::startup как раз таки определен - она запустится при загрузке *.lsp, но после того как все (defun этого файла будут проинициализированы. то есть наш s::startup может пользовать любую функцию загружаемого *.lsp

предлагаемый вами вариант автозапуска при загрузке *.lsp заключается в том чтобы вынести например (zouss:starter) за пределы любой функции Но тогда, если (zouss:starter) использует какую либо другую функцию, то эта самая другая должна находиться в буквальном смысле выше описания нашего стартера, да и сам стартер должен быть описан выше первого вызова Вот откуда растут ноги необъяснимых глюков, чаще всего как раз для файлов типа acad.lsp и acaddoc.lsp где бывает много обращений к общим функциям

блин нагрузил че-то... в обчем уважаемые оппоненты, если что киньте в меня кодом, а уж я в него внесу ошибку...
Zouss вне форума  
 
Непрочитано 17.03.2006, 11:51
#139
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


>Zouss
Цитата:
Так что я предпочитаю s::startup - и через много лет можно сообразить что в данной проге это автостарт
Это понятно. Но. Если s::startup находится в копии acaddoc.lsp, то он будет выполнятся с открытием любого файла в данной сессии AutoCAD. По моему тоже не очень красиво. Можно конечно делать как вы предлагаете проверки, на наличие особого блока или к примеру записи в словаре... Однако куча acaddoc.lsp с прописанными s::startup мне абсолютно не нравятся

s::startup - действительно в некоторых случаях глючит, особенно при наличии приложений подгружающих *.arx по какой то своей логике.

Я вообще не пользуюсь ни acaddoc.lsp ни s::startup, пишу всё в соответствующие *.mnl. В данном случае это конечно не проходит т. к. речь идёт о передаче файлов вместе с лиспами.

В общем дело вкуса...

А в данном случае с распечаткой программировать ничего не надо. Просто надо поиметь *.dwt сделанные для распечатки из пространства листов на разные форматы для соответствующего плотера.
{Smirnoff} вне форума  
 
Автор темы   Непрочитано 17.03.2006, 20:36
#140
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


До сегодняшнего дня я мирился с тем, что формат А1 = 835*589. Но теперь я буду играть по своим правилам.

А теперь представьте себе как округлятся глаза у девочки, которая будет печатать мои чертежи точнее когда он напечатается сам без предупреждения...
mmax вне форума  
 
Автор темы   Непрочитано 17.03.2006, 20:39
#141
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от {Smirnoff}
А в данном случае с распечаткой программировать ничего не надо. Просто надо поиметь *.dwt сделанные для распечатки из пространства листов на разные форматы для соответствующего плотера.
Еще как надо -- несовместимость настроек принтера. Я на свой вкус настраиваю , а у них по умолчанию.
mmax вне форума  
 
Автор темы   Непрочитано 18.03.2006, 18:18
#142
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от Zouss
to mmax

что то ты совсем отчаялся если такой обходной путь ищешь...
Plotsettings - это pagesetup, для каждого layout и для модели эта группа будет... Так вот, чтобы получить ((0 . "PLOTSETTINGS") надо сначала получить ((0 . "имянужногоLayout") а уже затем из этого составного объекта можно выдернуть ((0 . "PLOTSETTINGS") и все остальное Ежели хочешь погеморроиться поищи в хелпе акада на тему Creating & modifying complex entities
Насколько я понимаю с Plotsettings работают так же как с примитивами при помощи entmake
Все настройки печати можно поместить в список с DXF кодами у меня на них есть расшифровка на две страницы.
Мне кажется достаточно сварганить список например ((0. "Plotsettings") (2 . "HP450.PC3") (4 . "oversise ISO A1") (44 841) (45 594) (И . "так далее")) -- печать сконфигурирована
Вот только явно что entmake не запустит печать а этот список без определенных действий над ним не внедрится в базу рисунка.
Скажите пожалуйста как запустить печать с параметрами из этого списка.
mmax вне форума  
 
Непрочитано 20.03.2006, 10:03
#143
Zouss


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


Цитата:
Сообщение от mmax
Насколько я понимаю с Plotsettings работают так же как с примитивами при помощи entmake
совершенно верно, только такой путь хлопотный очень (по моему)
вот например как создается полилиния (пример из хелпа acada)
Код:
[Выделить все]
(entmake '((0 . "POLYLINE")    ; Object type
          (62 . 5)             ; Color
          (6 . "dashed")       ; Linetype
          (66 . 1)             ; Vertices follow
) )
(entmake '((0 . "VERTEX")      ; Object type
          (10 1.0 1.0 0.0)     ; Start point
) )
(entmake '((0 . "VERTEX")      ; Object type
          (10 4.0 6.0 0.0)     ; Second point
) )
(entmake '((0 . "VERTEX")      ; Object type
          (10 3.0 2.0 0.0)     ; Third point
) )
(entmake '((0 . "SEQEND")))    ; Sequence end
здесь "vertex" - подпримитив, в составе сложного примитива "polyline". В случае если ты будешь пользовать layout, надо будет кроме него определить эти самые plotsettings, wievports и т.д. Утешает то, что неуказанные DXF коды устанавливаются сами по умолчанию. Для подобных эпизодических вещей я пользую ("command - проще и быстрей отлаживается
Zouss вне форума  
 
Непрочитано 20.03.2006, 10:09
#144
Кулик Алексей aka kpblc
Moderator

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


Через (entmake) сделать Viewport нельзя, о чем прописывается в справке.
Насчет plotsettings - я думаю, что через (entmake) до них слишком тяжело будет добраться. Скорее всего, придется идти через (vla-) функции.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.03.2006, 11:01
#145
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


mmax
ИМХО - Вы просто плохо себе представляете сложность поставленной задачи, она никак не согласуется с названием темы. Однако я верю что при желании у вас все получится (хотя, я считаю что оно того не стоит). Исключительно ради примера, из моей мусорной корзинки такое произведение в тему (авось Вам поможет).
ПРЕДУПРЕЖДЕНИЕ: глюков там может быть немеряно, сам я этим не поьзуюсь, но когда-то оно работало, для примера сойдет.

Программа по выделенному участку в модели с заданным масштабом строит ВЭ в листе, для которого присваивается подбираемый формат и плоттер в зависимости от величины ВЭ, основная вызываемая функция C:APEL-PLOT-FORMAT.

Код:
[Выделить все]
;;;Получение списка всех конфигураций листов для всех принтеров
;;;!!!Прога работает достаточно долго, зависит от количества принтеров и форматов для них.
;;;!!!нужно перед запуском давать на это предупреждение
;;;Apelsinov
;;;18.05.05
(defun APEL-PLOT-LIST_CONF (/ new_plot_config list_plot_device)
  (setq	new_plot_config
	 (vla-add (vla-get-PlotConfigurations
		    (APEL-ACTIVE_DOCUMENT)
		  )
		  "APEL_TEMP"
	 )
  )
  (setq	list_plot_device
	 (vlax-safearray->list
	   (vlax-variant-value
	     (vla-GetPlotDeviceNames new_plot_config)
	   )
	 )
  )
  (if (vlax-property-available-p new_plot_config 'ConfigName T)
    (mapcar
      (FUNCTION
	(LAMBDA	(i)
	  (vla-put-ConfigName new_plot_config i)
	  (list	i
		(mapcar
		  (FUNCTION
		    (LAMBDA (f / A B)
		      (vla-put-CanonicalMediaName new_plot_config f)
		      (vla-GetPaperSize new_plot_config 'A 'B)
		      (list
			(vla-GetLocaleMediaName new_plot_config f)
			(list A B)
		      )
		    )
		  )
		  (vlax-safearray->list
		    (vlax-variant-value
		      (vla-GetCanonicalMediaNames
			new_plot_config
		      )
		    )
		  )
		)
	  )
	)
      )
      list_plot_device
    )
  )
)


;;;Запись конфигураций принтеров в файл
;;;Apelsinov
;;;18.05.05
(defun APEL-PLOT-LIST_CONF-FILE	(file_name / list_conf lit_conf_str)
  (setq list_conf (APEL-PLOT-LIST_CONF))
  (setq	conf_str
	 (apply	'STRCAT
		(mapcar
		  (function (LAMBDA (f) (strcat "\n" f)))
		  (apply
		    'append
		    (mapcar
		      (FUNCTION
			(LAMBDA	(i)
			  (cons
			    (VL-PRIN1-TO-STRING (car i))
			    (mapcar
			      (FUNCTION
				(LAMBDA	(a)
				  (apply 'strcat
					 (list
					   (VL-PRIN1-TO-STRING (car a))
					   " "
					   (VL-PRIN1-TO-STRING (cadr a))
					 )
				  )
				)
			      )
			      (cadr i)
			    )
			  )
			)
		      )
		      list_conf
		    )
		  )
		)
	 )
  )
  (if (setq file_patch (FINDFILE file_name))
    (APEL-FILE-WRITE_STR_W file_patch conf_str)
  )
)
;;;(APEL-PLOT-LIST_CONF-FILE "apel-plot-conf.txt")

;;;Запись строки в файл
;;;Apelsinov
;;;18.05.05
(defun APEL-FILE-WRITE_STR_W (file_name str /)
  (if (setq file_name (open file_name "W"))
    (progn
      (WRITE-LINE str file_name)
      (close file_name)
    )
  )
)

;;;Запуск activex и основных глобальных переменных
;;;Apelsinov
;;;13.05.05
(defun APEL-ACAD_APPLICATION ()
  (if (null *apel_acad_application*)
    (setq *apel_acad_application* (vlax-get-acad-object))
    *apel_acad_application*
  )
)

;;;Apelsinov
;;;18.05.05
(defun APEL-ACTIVE_DOCUMENT ()
  (if (null *apel_active_document*)
    (setq *apel_active_document*
	   (vla-get-activedocument
	     (APEL-ACAD_APPLICATION)
	   )
    )
    *apel_active_document*
  )
)

;;;Apelsinov
;;;18.05.05
(defun APEL-MODEL_SPACE	()
  (if (null *apel_model_space*)
    (setq *apel_model_space*
	   (vla-get-modelspace
	     (APEL-ACTIVE_DOCUMENT)
	   )
    )
    *apel_model_space*
  )
)

;;;Apelsinov
;;;18.05.05
(defun APEL-PAPER_SPACE	()
  (if (null *apel_paper_space*)
    (setq *apel_paper_space*
	   (vla-get-paperspace
	     (APEL-ACTIVE_DOCUMENT)
	   )
    )
    *apel_paper_space*
  )
)


;;;Преобразование списка целых чисел в список вещественных
;;;Apelsinov
;;;12.05.05
(defun APEL-SP-INT_TO_REAL (spis /)
  (mapcar (FUNCTION
	    (LAMBDA (i)
	      (mapcar (FUNCTION (LAMBDA (i) (* i 1.0))) i)
	    )
	  )
	  spis
  )
)

;;;Вычисление минимального прямоугольника из заданных в кот. вписывается исходный
;;;razm_0 - исходный (A B)
;;;spis_razm - заданные: ((A1 B1)(A2 B2)...(Ai Bi))
;;;Apelsinov
;;;12.05.05
(defun APEL-MAT-PODBOR_PEC (razm_0 spis_razm / spis_razm_1 spis_razm_2)
  (car
    (vl-sort (VL-REMOVE-IF
	       (FUNCTION
		 (LAMBDA (i)
		   (or (> (apply 'max razm_0) (apply 'max i))
		       (> (apply 'min razm_0) (apply 'min i))
		   )
		 )
	       )
	       (APEL-SP-INT_TO_REAL spis_razm)
	     )
	     (FUNCTION (lambda (i1 i2) (< (apply '* i1) (apply '* i2))))
    )
  )
)

;;;(APEL-MAT-PODBOR_PEC razm_0 spis_razm)
;;;Нахождение масштаба по расстоянию на чертеже и реальному расстоянию
;;;Apelsinov
;;;11.05.2005
(defun APEL_SCALE_POINTS (/ dist_real dist_draw)
  (if
    (and (setq dist_draw (getdist "\n Введите расстояние по чертежу:"))
	 (princ dist_draw)
	 (setq dist_real (getdist "\n Введите истинное расстояние:"))
    )
     (progn
       (setq scale (/ dist_real dist_draw))
       (princ (STRCAT "Указанный масштаб: " (rtos scale 2 5)))
       scale
     )
  )
)
;;;(APEL_SCALE_POINTS)


;;;Диалог ввода в ком строке текущего масштаба,
;;;с масштабом по умолчанию равным DIMSCALE
;;;и возможностью ввода масштаба по расстоянию
;;;Apelsinov
;;;11.05.2005
;;;Функции:
;;;APEL_SCALE_POINTS
(defun APEL_SCALE_TEXTDIAL (/ umolch_str ap_scale)
  (setq	umolch_str
	 (STRCAT "\n Введите масштаб или [Points] <"
		 (rtos (getvar "DIMSCALE") 2 3)
		 ">:"
	 )
  )
  (while (null ap_scale)
    (initget 4 "Points")
    (setq ap_scale (getreal umolch_str))
    (setq ap_scale (cond ((null ap_scale) (getvar "DIMSCALE"))
			 ((eq ap_scale "Points") (APEL_SCALE_POINTS))
			 ((eval ap_scale))
		   )
    )
  )
)
;;;(apel_scale_textdial)

;;;Apelsinov
;;;18.05.05
(defun APEL-FILE-READ (fname / str spis)
  (if (setq fname (open fname "r"))
    (progn
      (while (setq str (read-line fname))
	(setq spis (cons str spis))
      )
      (close fname)
      (reverse spis)
    )
  )
)
;;;(apel-file-read "C:\\ACAD_СD\\lisp\\apel-plot-format\\apel-plot-format.txt")

;;;Преобразование прочтенного файла APEL-PLOT-FORMAT в ассоциативный список
;;;имен форматов и списков их сторон
;;;name_file - имя файла
;;;возвр: список или Nil если файл не найден
(defun APEL-PLOT-FORMAT_FILE_ASSOC_LIST
       (name_file / file_patch name_format)
  (if (setq file_patch (FINDFILE name_file))
    (vl-Remove 'nil
	       (mapcar (FUNCTION
			 (LAMBDA (i)
			   (if (setq name_format (read i))
			     (cons
			       (read
				 (substr
				   i
				   (+ 4 (STRLEN name_format))
				 )
			       )
			       name_format
			     )
			   )
			 )
		       )
		       (apel-file-read file_patch)
	       )
    )
  )
)
;;;(APEL-PLOT-FORMAT_FILE_ASSOC_LIST "apel-plot-format.txt")

;;;Стороны прямоуугольника по двум заданным точкам
;;;Возврат - список длин сторон, или nil, если точки не были указаны
;;;Apelsinov
;;;11.05.2005
(defun APEL-LENDREC2POINT (point_1 point_2 /)
  (reverse
    (cdr (reverse (mapcar 'abs (mapcar '- point_1 point_2))))
  )
)
;;;(APEL-LENDREC2POINT )

;;;Нахождение каноничесого  имени формата листа по локальному
;;;name_format - имя формата листа локальное
;;;lay - VLA-OBJECT IAcadLayout
;;;  Apelsinov
;;;  13.05.05
(defun APEL-LAYOUT-LOCALE_TO_CANONICAL
       (name_format lay / list_canonical_name list_locale_mames)
  (setq	list_canonical_name
	 (vlax-safearray->list
	   (vlax-variant-value
	     (vla-getCanonicalMediaNames lay)
	   )
	 )
  )
  (setq	list_locale_mames
	 (mapcar (FUNCTION (LAMBDA (i) (vla-GetLocaleMediaName lay i)))
		 list_canonical_name
	 )
  )
  (cdr
    (assoc name_format
	   (mapcar 'cons list_locale_mames list_canonical_name)
    )
  )
)

;;;Создание viewport и его включение
;;;center_point - центр. точка список
;;;Apelsinov
;;;18.05.05
;;;A - ширина
;;;B - высота
(Defun APEL-PVPORT-CREATE (center_point A B / new_pvport)
  (vla-put-ViewportOn
    (setq new_pvport
	   (vla-AddPViewport
	     (APEL-PAPER_SPACE)
	     (vlax-3d-point center_point)
	     A
	     B
	   )
    )
    :vlax-true
  )
  new_pvport
)
;;;(APEL-PVPORT-CREATE '(297.0 210.0) 297.0 210.0) --> #<VLA-OBJECT IAcadPViewport 03436f74> 

;;;Создание листа
;;;Apelsinov
;;;18.05.05
;;;name-имя листа
;;;plotter- девайс
;;;format - формат бумаги
(Defun APEL-LAYOUT-CREATE_NAME_PLOTTER_FORMAT
					      (name plotter format /)
  (if (and (setq lay (APEL-LAYOUT-CREATE_NAME name (APEL-ACTIVE_DOCUMENT)))
	   (APEL-LAYOUT-APPLY-NAME_PLOTTER_FORMAT format plotter lay)
      )
    lay
  )
)
;;;(APEL-LAYOUT-CREATE_NAME_PLOTTER_FORMAT "JHDFGFD" "HP DesignJet 500 42 by HP.pc3" "Oversize: ISO A1  (landscape)")

;;;ориентация прямоугольника, заданного списком сторон
;;;1 - "Portrait"
;;;0 - "Landscape"
(defun APEL-PLOT-REC_ORIENT_AB (list_AB /)
  (if (apply '< list_AB)
    1
    0
  )
)
;;;(APEL-PLOT-REC_ORIENT_AB '(210 210)) -> 0

;;;имя для layout
;;;Apelsinov
;;;18.05.05
;;;name - строка с именем - к ней добавляется число
(defun APEL-PLOT-NEW_LAYT_NAME_N
       (name / laut_names_list N new_layt_name)
  (setq N 1)
  (while (member
	   (setq new_layt_name (STRCAT name (rtos N 2 0)))
	   (APEL-LAYOUTS-LIST_NAMES (APEL-ACTIVE_DOCUMENT))
	 )
    (setq N (+ N 1))
  )
  new_layt_name
)
;;;  (apel-plot-new_layt_name_N "TY_") - > "TY_1"

;;;Задание дырке в ВЭ окна по двум углам модели
;;;Apelsinov
;;;16.05.05
;;;Арг:
;;;new_vport - pvport для кот. задается
;;;point_1 - 1-й угол окна
;;;point_2 - 2-й угол окна
(defun APEL-VPORT-ZOOM_WINDOW
       (new_vport point_1 point_2 / svar_CMDECHO)
  (vlax-property-available-p (APEL-ACTIVE_DOCUMENT) 'mspace T)
  (vla-put-mspace (APEL-ACTIVE_DOCUMENT) :vlax-true)
  (vla-put-ActivePViewport (APEL-ACTIVE_DOCUMENT) new_vport)
  (setq svar_CMDECHO (getvar "CMDECHO"))
  (setvar "CMDECHO" 0)
  (vl-cmdf "_.ZOOM" "_W" point_1 point_2)
  (setvar "CMDECHO" svar_CMDECHO)
  (vla-put-mspace (APEL-ACTIVE_DOCUMENT) :vlax-false)
)

;;;Список имен всех листов в чертеже
;;;Apelsinov
;;;18.05.05
(defun APEL-LAYOUTS-LIST_NAMES (acad_document / laut_names_list)
  (vlax-for i (vla-get-Layouts acad_document)
    (setq laut_names_list (cons (vla-get-name i) laut_names_list))
  )
)
;;;(apel-layouts-list_names (APEL-ACTIVE_DOCUMENT)) -> ("Model" "Layout1")

;;;Присвоение листу плоттера с
;;;проверкой на существование такого имени плоттера/принтера
;;;Apelsinov
;;;18.05.05
;;;name_plotter - имя принтера
;;;layt - layout vla-obj
(defun APEL-LAYOUT-APPLY-NAME_PLOTTER (name_plotter layt /)
  (cond	((MEMBER name_plotter
		 (vlax-safearray->list
		   (vlax-variant-value (vla-GetPlotDeviceNames layt))
		 )
	 )
	 (null (vla-put-ConfigName layt name_plotter))
	)
  )
)
;;;(APEL-LAYOUT-APPLY-NAME_PLOTTER "large_format_of_DJ500.pc3" layt) --> T
;;;(APEL-LAYOUT-APPLY-NAME_PLOTTER "QWERasdf" layt) --> nil

;;;Присвоение листу формата и плоттера
;;;Проверкой на существование такого имени формата листа и плоттера
;;;ед.изм - мм
;;;масштаб листа устанавливается 1/1
;;;Apelsinov
;;;18.05.05
;;;name_format - имя формата
;;;name_plotter - имя принтера
;;;layt - layout vla-obj
(defun APEL-LAYOUT-APPLY-NAME_PLOTTER_FORMAT
       (name_format name_plotter layt / can_name_format)
  (if (APEL-LAYOUT-APPLY-NAME_PLOTTER name_plotter layt)
    (if	(setq can_name_format
	       (APEL-LAYOUT-LOCALE_TO_CANONICAL
		 name_format
		 layt
	       )
	)
      (progn
	(null (vla-put-UseStandardScale layt :vlax-false))
	(null (vla-SetCustomScale layt 1 1))
	(null (vla-put-CanonicalMediaName layt can_name_format))
	(null (vla-put-PaperUnits layt acMillimeters))
      )
    )
  )
)
;;;(APEL-LAYOUT-APPLY-NAME_PLOTTER_FORMAT "Oversize: Custom 4: 1050 x 594 mm. (landscape)" "HP DesignJet 500 42 by HP.pc3" layt)

;;;Создание листа с именем name_layout
;;;с проверкой на существование с таким именем уже
;;;Apelsinov
;;;18.05.05
;;;name_layout - строка с именем листа
;;;DOCUMENT - документ в кот создается лист
(defun APEL-LAYOUT-CREATE_NAME (name_layout DOCUMENT /)
  (if (null
	(member	name_layout
		(APEL-LAYOUTS-LIST_NAMES DOCUMENT)
	)
      )
    (vla-add (vla-get-Layouts (APEL-ACTIVE_DOCUMENT))
	     name_layout
    )
  )
)
;;;(APEL-LAYOUT-CREATE_NAME "QWERHGFGD" (APEL-ACTIVE_DOCUMENT)) --> #<VLA-OBJECT IAcadLayout 03415134>

;;;Определение ориентации по лимитам
;;;Apelsinov
;;;18.05.05
(defun APEL-LIMIT-ROTATION_REAL	(/)
  (APEL-PLOT-REC_ORIENT_AB
    (APEL-LENDREC2POINT
      (append (GETVAR "LIMMAX") (list 0))
      (append (GETVAR "LIMMIN") (list 0))
    )
  )
)

;;;Apelsinov
;;;18.05.05
(defun C:APEL-PLOT-FORMAT
			  (/		point_1	     point_2
			   assoc_format_list	     rec_0
			   rec_1	scale	     str_error
			   format	new_layt
			  )
  (if (eq 1 (vla-get-ActiveSpace (APEL-ACTIVE_DOCUMENT)))
    (if	(setq assoc_format_list
	       (APEL-PLOT-FORMAT_FILE_ASSOC_LIST
		 "apel-plot-format.txt"
	       )
	)
      (progn
	(setq point_1 T)
	(while (and point_1 (null (listp point_1)))
	  (initget "File")
	  (setq
	    point_1 (getpoint "\nSpecify first corner [File] <exit>:")
	  )
	  (if (eq point_1 "File")
	    (progn
	      (alert
		"\n ВНИМАНИЕ!!!
	      \n Вы хотите переписать файл конфигураций apel-plot-format.txt.
	      \n Если Вы уже пользовались этой опцией,
	      \n рекомендую сохранить уже имеющийся у вас файл apel-plot-format.txt.
		\n На создание файла конфигураций может уйти продолжительное время,
		\n около 15 минут, в зависимости от количества принтеров и их конфигураций"
	      )
	      (initget "Yes No")
	      (if
		(eq
		  (GETKWORD
		    "\n Вы действительно хотите переписать файл конфигураций apel-plot-format.txt [Yes/No] <Nо>:"
		  )
		  "Yes"
		)
	       (APEL-PLOT-LIST_CONF-FILE
		 "apel-plot-format.txt"
	       )
	      )
	    )
	  )
	)
	(if
	  (and point_1
	       (setq
		 point_2 (GETCORNER point_1
				    "\nSpecify opposite corner:<exit>:"
			 )
	       )
	       (setq rec_0 (APEL-LENDREC2POINT point_1 point_2))
	  )
	   (if (setq scale (APEL_SCALE_TEXTDIAL))
	     (PROGN
	       (setq
		 rec_0
		  (mapcar (FUNCTION (LAMBDA (i) (* i scale))) rec_0)
	       )
	       (if (setq rec_1 (APEL-MAT-PODBOR_PEC
				 rec_0
				 (mapcar 'car assoc_format_list)
			       )
		   )
		 (progn
		   (setq plot_devise
			  (cdr (assoc
				 'nil
				 (member
				   (setq format (assoc rec_1 assoc_format_list))
				   (reverse assoc_format_list)
				 )
			       )
			  )
		   )
		   (vla-put-ActiveLayout
		     (APEL-ACTIVE_DOCUMENT)
		     (setq
		       new_layt
			(APEL-LAYOUT-CREATE_NAME_PLOTTER_FORMAT
			  (APEL-PLOT-NEW_LAYT_NAME_N "TY_")
			  plot_devise
			  (cdr format)
			)
		     )
		   )
		   (if
		     (not (eq (APEL-PLOT-REC_ORIENT_AB rec_0)
			      (APEL-LIMIT-ROTATION_REAL)
			  )
		     )
		      (vla-put-PlotRotation
			new_layt
			(abs (- (vla-get-PlotRotation new_layt) 1))
		      )
		   )
		   (setq *apel_paper_space* nil)
		   (APEL-VPORT-ZOOM_WINDOW
		     (APEL-PVPORT-CREATE
		       (mapcar (FUNCTION (LAMBDA (i) (/ i 2))) rec_0)
		       (car rec_0)
		       (cadr rec_0)
		     )
		     point_1
		     point_2
		   )
		   (VL-CMDF "_.REGEN")
		   (setq str_error (strcat "Формат листа: "
					   (cdr format)
					   "\nДевайс: "
					   plot_devise
				   )
		   )
		 )
		 (setq str_error
			"Нет описания такого формата, возможно слишком большой"
		 )
	       )
	     )
	     (setq
	       str_error "Не был введен масштаб, программа остановлена"
	     )
	   )
	   (setq
	     str_error
	      "Не были введены углы рамки, программа остановлена"
	   )
	)
      )
      (setq str_error
	     "Не найден файл описания форматов, программа остановлена"
      )
    )
    (setq str_error
	   "Программа работает только в пространстве модели, перейдите в модель"
    )
  )
  (princ (strcat "\n" str_error))
  (princ)
)
Apelsinov вне форума  
 
Автор темы   Непрочитано 20.03.2006, 16:17
#146
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от Apelsinov
mmax
ИМХО - Вы просто плохо себе представляете сложность поставленной задачи, она никак не согласуется с названием темы. Однако я верю что при желании у вас все получится (хотя, я считаю что оно того не стоит). Исключительно ради примера, из моей мусорной корзинки такое произведение в тему (авось Вам поможет).
ПРЕДУПРЕЖДЕНИЕ: глюков там может быть немеряно, сам я этим не поьзуюсь, но когда-то оно работало, для примера сойдет.
Господа,
Я всетаки понял что запустить печать на чужом компьютере без моего участия лучше всетаки с помощью
Код:
[Выделить все]
(command "_.plot" ... ... ... )
Имея ввиду что у меня будет нужный PC3 и лист настроен на данную конфигурацию.
Программа предположительно на 2-3 строчки.
mmax вне форума  
 
Непрочитано 20.03.2006, 16:50
#147
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


Цитата:
Сообщение от mmax
Господа,
Я всетаки понял что запустить печать на чужом компьютере без моего участия лучше всетаки с помощью
Код:
[Выделить все]
(command "_.plot" ... ... ... )
Имея ввиду что у меня будет нужный PC3 и лист настроен на данную конфигурацию.
Программа предположительно на 2-3 строчки.
Честно говоря, я сам не пробовал запускать печать другим методом, а этого добра у нас есть (из той же мусорной корзинки):
Код:
[Выделить все]
;;;(plotml [имя принтера] [формат листа] [таблица стиля печати])
;;;например : ^C^C(plotml "HP Color Inkjet CP1700.pc3" "A4 (210 x 297 мм) " "000.CTB"),
;;;данные по принтеру и формату можете посмотреть поэкспериментировав с коммандой -plot.
;;;(на запрос принтера или формата введите ? , акад выдаст допустимые значения)
;;;Теперь, если вы нажмете на эту кнопку акад запросит от Вас две точки рамки,
;;;то что попадет в рамку будет напечатано на выбранном Вами принтере и формате,
;;;в соответствии с указанной таблицей. Масштаб будет вписанный (!)

;;;*********
;;;Apelsinov
;;;22.02.05
;;;plotml
;;;*********
(defun plotml (printer format tabulka / xy1 xy2)
  (if (and (setq xy1 (getpoint "\n Первый угол рамки <Выход>:"))
           (setq xy2 (getcorner xy1 "\n Второй угол рамки <Выход>:"))
      )
    (APEL-PLOT-WIN printer format tabulka (list xy1 xy2))
    (princ "\n Ничего распечатано небыло" )
  )
  (princ)
)

;;;*********
;;;Apelsinov
;;;22.02.05
;;;apel-plot-extents
;;;*********
(defun apel-plot-extents (printer format tabulka /)
;;;  (apel-plot-extents "LAZERPRINTER.pc3" "A4" "TIMUR.CTB") 
  (APEL-PLOT-WIN
    printer
    format
    tabulka
    (list (getvar "extmin") (getvar "extmax"))
  )
  (princ)
)

;;;*********
;;;Apelsinov
;;;22.02.05
;;;APEL-PLOT-WIN
;;;*********
(defun APEL-PLOT-WIN (printer format tabulka coord / a cmd xy1 xy2 L)
    (princ (strcat "\n Печать на "	       printer
		 "; Формат:"	format	       " Стиль:"
		 tabulka "\n"
		)
  )
  (setq	cmd (getvar "cmdecho")
	xy1 (car coord)
	xy2 (cadr coord)
	a   (angle xy1 xy2)
  )
  (if (or (and (> a (* pi 0.25)) (< a (* pi 0.75)))
	  (and (> a (* pi 1.25)) (< a (* pi 1.75)))
      )
    (setq a "_Portrait")
    (setq a "_Landscape")
  )
;;;  (setvar "cmdecho" 0)

  (if (eq (getvar "tilemode") 0)
    (VL-CMDF "_.-plot"			;сама команда
	     "_y"			;нужны настройки
	     ""				; Лист или модель
	     printer			;Собственно принтер
	     format			;Формат листа
	     "_Millimeters"		;Ед. измерения
	     a				;Ориентация листа
	     "_N"			;Зеркалить лист
	     "_Window"			;Область печати
	     xy1			;Первая точка окна
	     xy2			;Вторая точка окна
	     "_fit"			;Масштаб
	     "_center"			;Сдвиг листа
	     "_yes"			;Печать со стилем
	     tabulka			;Стиль
	     "_Yes"			;Учитывать заданные толщины линий
	     "_No"			;масштабироватьтолщины линий
	     "_No"			;Хрен че такое?
	     "_No"			;Удалять скрытые линии
	     "_No"			;Печатать в файл
	     "_no"			;Сохранить настройки
	     "_yes"			;Старт печати
	    )
    (VL-CMDF "_.-plot"			;сама команда
	     "_y"			;нужны настройки
	     "Model"			;Лист или модель
	     printer			;Собственно принтер
	     format			;Формат листа
	     "_Millimeters"		;Ед. измерения
	     a				;Ориентация листа
	     "_N"			;Зеркалить лист
	     "_Window"			;Область печати
	     xy1			;Первая точка окна
	     xy2			;Вторая точка окна
	     "_fit"			;Масштаб
	     "_center"			;Сдвиг листа
	     "_yes"			;Печать со стилем
	     tabulka			;Стиль
	     "_Yes"			;Учитывать заданные толщины линий
	     "_No"			;Удалять скрытые линии
	     "_No"			;Печатать в файл
	     "_No"			;Сохранить настройки
	     "_Yes"			;Старт печати
	    )
  )

;;;  (command "preview")
;;;  (setvar "cmdecho" cmd)
;;;(command "_.vbastmt" "ThisDrawing.Close False")
)
Apelsinov вне форума  
 
Непрочитано 20.03.2006, 20:27
#148
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Я смотрю тема пользуется популярность.
Поздравьте меня на конецто мне привезли книжку " LISP Секреты адоптации"
У меня вопрос требуется Сделать такую чтуку (4."fg")
Fg -переменная и должна меняться
  • (Setq i 1)
    (setq fg i)
    (setq fg (itoa fg))
    (Cons '4 '"fg")
    (setq i (+ i 1)
??????

Фрагмент программы.
favorite вне форума  
 
Непрочитано 20.03.2006, 20:37
#149
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


favorite
нифига не понятно...
если просто точечную пару из 4 и значения переменной fg, то:
Код:
[Выделить все]
(setq fg 1)
(cons 4 fg)
вернет пару: '(4 . 1)
Apelsinov вне форума  
 
Непрочитано 20.03.2006, 20:59
#150
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Да нет значение fg должно меняться от 1 до 100 к примеру
выглядить должно так (4 . "77") (4 . "78")......(4 . "100")
Просто я цикл не написал
favorite вне форума  
 
Непрочитано 20.03.2006, 22:21
#151
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Что то вроде такого
Код:
[Выделить все]
(setq i 1)
(while (<= i 100)
  (setq lst (cons (cons 4 (rtos i)) lst))
  (setq i (1+ i))
)
(reverse lst)
А в чем проблема то?
vk вне форума  
 
Непрочитано 21.03.2006, 08:20
#152
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Спасибо, но я вот так сделат
вместо cons Vl-lisT* вставил и получилось
  • (setq i 1)
    (while (< i 5)
    (setq a (nentsel))
    (setq a (car a))
    (setq st (entget a))
    (setq v (assoc 1 st))
    (entmod (subst (vl-list* 1 ( itoa i)) v st))
    (setq i (1+ i))
    (command "._regenall")
    )

А что делает rtos?
favorite вне форума  
 
Непрочитано 21.03.2006, 09:23
#153
VVA

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


>favorite
Цитата:
Поздравьте меня на конецто мне привезли книжку " LISP Секреты адоптации"
Цитата:
А что делает rtos?
стр. 95 п. 2.7.4.
VVA вне форума  
 
Автор темы   Непрочитано 22.03.2006, 00:31
#154
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Гспода, предлагаю вам на освистание программу черчения фланца.
В ней устранены все глюки и при принудительном выходе все переменные возвращаются на свои места.
В создании принимали участие:
vk
Apelsinov
Елпанов Евгений
[ATTACH]1142976684.rar[/ATTACH]
mmax вне форума  
 
Непрочитано 22.03.2006, 03:58
#155
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от mmax
Гспода, предлагаю вам на освистание программу черчения фланца.
В ней устранены все глюки
Фланец начертить с первого раза не удалось. Зато получился фрагмент капустной грядки. Картинку прилагаю Рекомендую дачникам взять на вооружение
[ATTACH]1142989090.gif[/ATTACH]
Правда, в командной строке была какая то ругань, но с этим, я думаю, можно смириться


Шутка, конечно. А если серьезно, никогда не верь пользовательскому вводу. Каждое значение надо проверять. Капустная грядка получилась когда ввел отфонарные, явно неправильные значения. Правда, повторить не удалось, видимо, фонарь погас
vk вне форума  
 
Непрочитано 22.03.2006, 09:41
#156
Кулик Алексей aka kpblc
Moderator

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


> mmax : Несколько замечаний можно?
1. В самом конце файла проверь - поставлено двоеточие ":" вместо точки с запятой ";".
2. Что будет, если диалог не найден (не найден файл диалога, диалог не загрузился и проч?)
3. Внешние функции (типа получения списка имен слоев) можно засунуть как локальные в тело основной программы.
4. Можно заменить строку
Код:
[Выделить все]
(vl-cmdf "_.layer" "_s" layer_kontur_line_q "")
на такое (по выбору):
Код:
[Выделить все]
(setvar "clayer" layer_kontur_line)
;; Либо, если идти через vla-функции:
(vla-put-ActiveLayer (vla-get-ActiveDocument (vlax-get-acad-object)) (vla-item (vla-get-Layers (vla-get-ActiveDocument (vlax-get-acad-object))) layer_kontur_line))
5. Опять же, с точки зрения "обезьяны с гранатой" (хотя тут больше подойдет тюбик со стронцием): что будет, если в (povtor_old_param) на запрос точки нажать Esc? Или правую кнопку мыши?
6. Несколько строк setq подряд желательно объединять в одну. Т.е. заменить
Код:
[Выделить все]
      (setq samo_polyg_nar_prop_q (entget samo_name_polyg_q_nar))
      (setq samo_spis_polyg_nar_prop_q (cdr samo_polyg_nar_prop_q))
      (setq samo_centr_nar_otv_q
	     (mapcar '(lambda (y) (assoc 10 (list y)))
		     samo_spis_polyg_nar_prop_q
		     ) ;_ end of mapcar
	    ) ;_ end of setq
      (setq samo_real_centrs_nar_otv_q
	     (vl-remove-if 'null samo_centr_nar_otv_q)
	    ) ;_ end of setq
на
Код:
[Выделить все]
      (setq samo_polyg_nar_prop_q
	     (entget samo_name_polyg_q_nar)
	    samo_spis_polyg_nar_prop_q
	     (cdr samo_polyg_nar_prop_q)
	    samo_centr_nar_otv_q
	     (mapcar '(lambda (y) (assoc 10 (list y)))
		     samo_spis_polyg_nar_prop_q
		     ) ;_ end of mapcar
	    samo_real_centrs_nar_otv_q
	     (vl-remove-if 'null samo_centr_nar_otv_q)
	    ) ;_ end of setq
7. И последнее Я бы вставил обработчик ошибок все-таки. Код публиковался и здесь, и на аркаде (прошу не наезжать - повторять код лень).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.03.2006, 09:45
#157
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


Цитата:
Сообщение от mmax
<...>В создании принимали участие:
vk
Apelsinov
Елпанов Евгений
Я буду все отрицать! [шутка]
Apelsinov вне форума  
 
Автор темы   Непрочитано 22.03.2006, 12:25
#158
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


К сожалению в 2006 работает глюкаво -- глюки с повторным запуском, которые отсутствовали в 2005. Вринципе эту функцию надо будет переработать. Хотя это не очень нужная функция можно от нее отказаться. Если в 2005 иногда оставался полигон то в 2006 появились какието странные точки соответствующие центрам отвертий.

Цитата:
Зато получился фрагмент капустной грядки
Цитата:
А если серьезно, никогда не верь пользовательскому вводу. Каждое значение надо проверять. Капустная грядка получилась когда ввел отфонарные, явно неправильные значения. Правда, повторить не удалось, видимо, фонарь погас
Ну здесь просто надо ввести нужные значения. Вы же когда разрабатываете фланец или лючок руководствуетесь не только фантазией, введите соответствующие действительноси значения и у вас все получится, а если расчетах у вас диаметры отверстий больше чем соединяющая их хорда, то вы явно гдето допустили ошибку в расчетах. Здесь я не буду ограничивать пользователя в фантазии, а вдруг ему действительно понадобится капуста.

Цитата:
2. Что будет, если диалог не найден (не найден файл диалога, диалог не загрузился и проч?)
Автокад должен сам с этим справиться.

Цитата:
3. Внешние функции (типа получения списка имен слоев) можно засунуть как локальные в тело основной программы.
Эта функция, предоставленная Apelsinovым, нужна будет для других программ, так же появятся функции получени списков текст. стилей разм.стилей итд. и все они будут использоваться в других программах.

Код:
[Выделить все]
И последнее  Я бы вставил обработчик ошибок все-таки
Ну а собственно и обрабатывать тут нечего только одно CMDECHO и то думаю и без него хорошо

Цитата:
Я буду все отрицать! [шутка]
Ваша функция занесена в отдельный файл, выложена в предыдущих топиках и отрицать чтото безполезно.
mmax вне форума  
 
Непрочитано 22.03.2006, 12:56
#159
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от mmax
Здесь я не буду ограничивать пользователя в фантазии, а вдруг ему действительно понадобится капуста.
Ну, дело хозяйское. Тогда придется корректно обрабатывать и отфонарный ввод - лишняя отладка... Кроме того, элементарный человеческий фактор -
Код:
[Выделить все]
            label = "Радиус наружной окружности";
            label = "Радиус внутренней окружности";
потом вдруг
Код:
[Выделить все]
            label = "Диаметр отверстий";
и снова
Код:
[Выделить все]
            label = "Расположение отверстий по радиусу";
эт придется мозги напрягать, чтоб радиус с диаметром нигде не попутать

Цитата:
Сообщение от mmax
Цитата:
2. Что будет, если диалог не найден (не найден файл диалога, диалог не загрузился и проч?)
Автокад должен сам с этим справиться.
В любом случае, надо сообщить пользователю что "по техническим причинам" прога дальше работать не будет... ну и корректно завершить ее...

Цитата:
Сообщение от mmax
Код:
[Выделить все]
И последнее  Я бы вставил обработчик ошибок все-таки
Ну а собственно и обрабатывать тут нечего только одно CMDECHO и то думаю и без него хорошо
Позволю себе не разделить Ваше мнение. Лично мне как то удобней с CMDECHO = 1 после отработки программы, если не возражаете.
vk вне форума  
 
Непрочитано 22.03.2006, 19:21
#160
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Скажити а как в функции ssget организовать фильтр, выбора блоков ну по их названиям.
favorite вне форума  
 
Непрочитано 22.03.2006, 19:28
#161
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


Код:
[Выделить все]
(ssget '((0 . "INSERT")(8 . "имя блока")))
__________________
apel.fas
Apelsinov вне форума  
 
Непрочитано 22.03.2006, 19:30
#162
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


0. insert указывает на блок .
8 ."имя блока" а можно несколько имен указать?

Спасибо.
favorite вне форума  
 
Автор темы   Непрочитано 22.03.2006, 22:31
#163
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Код:
label = "Радиус наружной окружности";
label = "Радиус внутренней окружности";

потом вдруг
Код:
label = "Диаметр отверстий";
и снова
Код:
label = "Расположение отверстий по радиусу";

эт придется мозги напрягать, чтоб радиус с диаметром нигде не попутать
Думаю здесь не надо мозги напрягать, радиусы фланца это одно.
А вот отверстия бывают в основном для болтов М10 М16...... итд, если запросить радиус то например у механика мозги больше закипят.
Хотя программа создавалась как раз для тупого ввода и при тупом вводе проще получить худобедный фланец оперируя радиусами, а так как болты измеряются в диаметрах то им и дан диаметр. Вобщем по этому вопросу можно целую тему открыть и долго дискутировать.

А по поводу ввода текста или нецелых чисел в поле "количество", то тут все сделано, недаром там есть функция ALERT с предупреждением.
Вчера перешел на 2006 и появились баги ведем отладку.
mmax вне форума  
 
Автор темы   Непрочитано 22.03.2006, 23:45
#164
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Уважаемые господа, вам представилась возможность оценить мой первый шедевр «Фланец», а также пользователям Автокад 2006 все его баги.
Баги я исправлю, но есть вопросы вопросы и еще раз вопросы.

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

???????????????????????????????????????????
Осталась одна проблема
(getpoint)
CMDECHO страдает, что делать?
Как позволить пользователю нажать ESK безболезненно?
Если например он задал количество фланцев 100 и решил что это много и только в момент выбора точки вставки он может отказаться от продолжения программы.
???????????????????????????????????????????
mmax вне форума  
 
Непрочитано 23.03.2006, 01:31
#165
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от mmax
Как позволить пользователю нажать ESK безболезненно?
Наверно все таки ESC...
В начале программы ставишь точку возврата. Можно через команду _.UNDO, а можно где то в начале, пока не было сделано изменений
Код:
[Выделить все]
(setq doc  (vla-get-activedocument (vlax-get-acad-object)))
......

           (vla-startundomark doc)      ; начало новой группы Undo
В конце программы соответственно
Код:
[Выделить все]
       (vla-endundomark doc)
Ну и где то (удобнее в начале, хотя по большому счету без разницы) определяешь обработчик ошибок что то вроде
Код:
[Выделить все]
  ;;--------------------------------------------------------------------------
  ;; Обработка ошибок
  (defun *error* (s)
    (princ (if (member s '("Function cancelled" "quit / exit abort" "*Прервано*" "завершить / выйти прервать"))
             "\nОтменено пользователем"
             (strcat "\nОднако, ошибка... " s " ERRNO=" (rtos (getvar "errno") 2 0))
           ) ;_  if
    ) ;_  princ
    (if (and dclnm (findfile dclnm))
      (vl-file-delete dclnm) ;_ удаление файла dcl
    )
    (if doc
      (progn
        (vla-endundomark doc)           ; завершим группу UNDO
        (vlax-release-object doc)
        (vl-cmdf "_.u")                 ; отмена сделанных изменений
      ) ;_  progn
    ) ;_  if
  ) ;_  defun
Здесь выложил немного замудреный обработчик - в программе динамически формируется файл диалога и плюс попытка правильно обработать сообщение об ошибке в русифицированных версиях. На самом деле чаще немного проще. Если в программе использовались какие то указатели на объекты - их тоже надо отрелизить в обработчике ошибок (если придется выводить напрямую в Ексель - он не простит зависших объектов )
Разумеется, *error* нужно так же локализовать. Кстати, ее можно переопределять по ходу программы любое число раз. Это даст возможность отследить какие то специфические ошибки.
vk вне форума  
 
Непрочитано 23.03.2006, 08:25
#166
Кулик Алексей aka kpblc
Moderator

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


> mmax : Честно скажу, я не запускал на выполнение код. Есть вопрос: а почему бы не сделать цикл такого типа:
Код:
[Выделить все]
(while (setq point (getpoint "\nУкажите точку вставки <Выход> : "))
  ;; тра-ля-ля
  ) ;_ end of while
И волки сыты, и овцы целы. Т.е. пока идет указание точки, идет и работа. Как только point становится nil (неважно, почему - Esc нажали, правую кнопку, пробел - по фигу) выполняется выход из цикла. Если по Esc, то идет обработка ошибки. Любой другой случай - что там дальше после цикла.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.03.2006, 08:49
#167
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Я, оно, канешна, дико извиняюсь , но мне непонятно - а для на хрена ваще параметы фланца вручную вводить? [sm2100] Фланцы, слава богу, стандартизированы, все размеры известны. Почему бы, как водится в приличных домах не ограничиться всего тремя вопросами: 1 - Номер ГОСТА - выбирается база данных из списка, 2 - Условное давление - выбирается группа наборов размеров и 3 - Условный проход - выбираются набор размеров. Весь выбор производиттся из падающих меню единственного диалогового окна. И никаких ошибок ввода данных! Apelsinov, Fatty, VK и примкнувший к ним kpblc задумчтво курят в сторонке :twisted:.
Да, главное забыл! Такая программа уже выкладывалась в Download. Я ее использовал - работает, как часы.
Лентяй вне форума  
 
Непрочитано 23.03.2006, 09:33
#168
Кулик Алексей aka kpblc
Moderator

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


> Лентяй : Так и ссылочку покажи на download-е
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.03.2006, 09:44
#169
VVA

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


>favorite №162
Цитата:
0. insert указывает на блок .
8 ."имя блока" а можно несколько имен указать?
8- имя слоя
2- имя блока

Можно использовать шаблоны, как в ф-ции wcmatch

Код:
[Выделить все]
(setq ss (ssget '((0 . "INSERT")(2 . "*блок*,*_c,TEST"))))
выберет блоки:
- все в имени которых есть блок (мойблок, блок1, и т.д.)
- все, заканчивающиеся на (krug_c, treug_c и т.д.)
- и в придачу к ним блок TEST
VVA вне форума  
 
Непрочитано 23.03.2006, 09:54
#170
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Цитата:
Сообщение от kpblc
> Лентяй : Так и ссылочку покажи на download-е
Ишь ты какой, загребущий - как мед, так тебе и ложку подай! Ладно, держи наводку: ступай в Download, ищи там dwl119.zip и да обрящещь . А там - не токмо. что фланцы, но и ваще отрисовка корпусов сосудов, во как!
Лентяй вне форума  
 
Непрочитано 23.03.2006, 10:07
#171
Кулик Алексей aka kpblc
Moderator

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


> Лентяй : я далек от таких проблем, мене оно не треба. Ссылка больше нужна mmax, так что от его имени (да и от моих юзеров) Тебе земной поклон (ох-охо-ох, теперь бы разогнуться ).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.03.2006, 10:19
#172
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


> kpblc
Могу, если надо, помочь коленом под зад
Лентяй вне форума  
 
Непрочитано 23.03.2006, 20:26
#173
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от Лентяй
Фланцы, слава богу, стандартизированы, все размеры известны.
Для стандартных, возможно, лучше блоки использовать. Нафиг их программно то рисовать? Другое дело, когда нестандартные...
vk вне форума  
 
Непрочитано 23.03.2006, 21:15
#174
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Цитата:
Сообщение от vk
Для стандартных, возможно, лучше блоки использовать. Нафиг их программно то рисовать?
А не замодухаетесь ли вы, уважаемый, на каждый типоразмер блок ваять? Это ж, поди, по всем рядам давлений если, за пару тысяч может перескочить. А на такие подвиги, как всем известно, только мусье Danilin с его лошадиным терпением способен. Толи дело параметрический способ, как в указанной мной ссылке, или, если идти в ногу со временем, динамический блок!
Цитата:
Другое дело, когда нестандартные...
А вы скачайте указанный архив - там и нестандартные будут. Но! Только в рамках установленных правил.
Лентяй вне форума  
 
Автор темы   Непрочитано 24.03.2006, 21:51
#175
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от Лентяй
Я, оно, канешна, дико извиняюсь , но мне непонятно - а для на хрена ваще параметы фланца вручную вводить? [sm2100] Фланцы, слава богу, стандартизированы, все размеры известны.
Ну вопервых я начал еще только изучать LISP надо же мне чем нибудь заняться, Напримере этой программы я узнал где и как можно применять LAMBDA, крутить вертеть списки и извлекать из них нужные элементы итд итп.

Цитата:
Сообщение от Лентяй
Почему бы, как водится в приличных домах не ограничиться всего тремя вопросами: 1 - Номер ГОСТА - выбирается база данных из списка, 2 - Условное давление - выбирается группа наборов размеров и 3 - Условный проход - выбираются набор размеров.
Бывают не только стандартные фланцы есть еще смотровые лючки, не несущие никакой нагрузки, муфты валов, манжетные уплотнения, кольца с дырочками для различного применения и все стандартные .
Стандартов много, а две окружности по краям кружочки, -- одни для всех.

Если выбирать из ГОСТа то должна бвыть хорошая база данных, а здесь и двух страниц кода не наберется.
Да и вообще перед выбором фланца его предварительно надо расчитать руками и оформить расчеты на бумаге и на этой же бумаге в конце расчета указать "выбран фланец ГОСТ ххххх " и вроде только тогда приступают к черчению. Так почему бы просто не указать три радиуса да количество отверстий так более универсально будет.

Цитата:
Сообщение от Лентяй
И никаких ошибок ввода данных!
А у меня и нет ошибок ввода данных -- текст превращается в ноль.
Нецелые округляются до целых. А программ позволяет рисовать не только фланцы, но и наборы окружностей по заданному алгоритму.

Цитата:
Сообщение от Лентяй
Apelsinov, Fatty, VK и примкнувший к ним kpblc задумчтво курят в сторонке :twisted:.
.
Эти товарищи помогают мне осваивать LISP
Огромное им спасибо.
mmax вне форума  
 
Автор темы   Непрочитано 24.03.2006, 21:54
#176
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Фланец готов полностью если не считать нажатие ЕSC во время указания точки.
И еще один БЭД не очень значительный.
Не буду приводить пока полностью всю программу суть проблемы можно извлечь отсюда:

Код:
[Выделить все]
(defun test (/ cpoint)

    (setq cpoint (getpoint "Укажите точку"))

(vl-cmdf "_circle" cpoint 19)
  
  )
(repeat 8  (test)) ; вместо 8 можно поставить любое число
Результат работы программы положительный вот только в Акаде 2006 в командной строке которая у курсора и в обычной строке при втором и теретьем вызове функции (test) функцией (repeat n (test)) выдается сообщение :

Код:
[Выделить все]
Can’ t  _reenter LISP ;это в обычной строке

Invalid point ; а это еще и в висячей у курсора
Укажите точку
В принципе, все то что предписывалось программе выполняется на 100% вот только Invalid point несколько портит картину своим присутствием. Как говорится результат получен да вот только осадок нехороший остался.
Почему вообще возникает такая проблема?
И почему точка получает инвалидность именно при втором и третьем запуске а при других запусках нет я пробовал (repeat 50 (test)) тоже только второй и третий раз.

Пробовал просто от балды

Код:
[Выделить все]
(defun test (/ cpoint)
  (setq testpoint (getpoint "testp"))
    (setq cpoint (getpoint "Укажите точку"))

(vl-cmdf "_circle" cpoint 19)
  
  )
(repeat 8  (test)) ; вместо 8 можно поставить любое число
здесь инвалидность давали только точке testpoint , а cpoint уже проходит без инвалидности.
Скажите как избавиться от инвалидности вообще.
mmax вне форума  
 
Непрочитано 25.03.2006, 00:06
#177
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от mmax
вот только в Акаде 2006
......
точка получает инвалидность именно при втором и третьем запуске а при других запусках нет я пробовал (repeat 50 (test)) тоже только второй и третий раз.
Это происходит _только_ в 2006? Косяков вроде нет, в 2005 не ворчит...
В любом случае, в первую очередь поглядеть в дебагере (или же просто через (princ) вывести содержимое переменной cpoint в командную строку), в какой момент дурь лезет, убедиться что точка передается верно. Ну и наверняка стоит обратить внимание на функцию (initget).

PS 2006 не имею, потому посмотреть не смогу. Может там что то изменили в (getpoint) - это в хелп лезть надоть....
vk вне форума  
 
Автор темы   Непрочитано 25.03.2006, 11:21
#178
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от vk
PS 2006 не имею, потому посмотреть не смогу. Может там что то изменили в (getpoint) - это в хелп лезть надоть....
В обычной командной строке эта грязь выглядит не так противно. А в 2006 есть еще дубль командной строки котроый висит у курсора и передвигается вместе с ним. Так там еще какойто дорожный (!) знак перед Invalid point -- картина неприятная, и зачем она нужна если функция все равно выполняется правильно.

Забыл напомнить если запускать из редактора VisualLISP, то все проходит гладко, а если запустить с помошью (load) или через Tools==>Load App... тогда вылезает этот косяк,

И вообще я давно заметил, что если из редактора VisualLISP программы идут без косяков, то это не значит, что они будут работать нормально вне редактора -- при вызове другими средствами.
mmax вне форума  
 
Непрочитано 25.03.2006, 12:03
#179
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Помогите. При изучении возникли вопросы .
Пробую программу написать для спецификации арматуры.

Как из файла прочесть нужную строку командой read-line
требуется прочесть 7 строку, но сразу команду read -line не повторяя.
Можно ли это сделать и как?
Тотже самый вопрос по Entsel у меня блок с аттрибутами требуется
вычленить к примеру 3 аттрибут, я делал так (entnext(entnext (entnext gggg))) Можно как-то иначе Entnext не повторяя? Причем предварительно записав предыдушие значения имен аттрибутов в локальные переменные.
Я организовал так:
Код:
[Выделить все]
(setq SPEC (ssget))
(setq Kolvo_ST (sslength SPEC))
(setq i 0)
					;(While (/= i (- Kolvo_ST 1))
(setq Imi1 (ssname SPEc i))
  
(setq POZ_1 (entnext Imi1));ÌÀññà èòîãî
(SEtq SPPOZ_1 (entget POZ_1))

(setq POZ_2 (entnext POZ_1));Ìàññà
(SEtq SPPOZ_2 (entget POZ_2))

(Setq POZ_3 (entnext POZ_2));Êîëè÷åñòâî
(SEtq SPPOZ_3 (entget POZ_3))

(Setq POZ_4 (entnext POZ_3));Äëèíà
(SEtq SPPOZ_4 (entget POZ_4))

(Setq POZ_5 (entnext POZ_4));Äèàìåòð
(SEtq SPPOZ_5 (entget POZ_5))

(Setq POZ_6 (entnext POZ_5));Ïîçèöèÿ
(SEtq SPPOZ_6 (entget POZ_6))
Может можно не так громоздко?
favorite вне форума  
 
Непрочитано 25.03.2006, 12:37
#180
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


> mmax
Таки что же в таком случае дает вывод текущих значений в командную строку?
И еще, бормотание в командной строке можно придавить - системные переменные cmdecho и nomutt (последняя не документирована была)

> favorite
По первому - вопросу читать построчно, в цикле.
По второму - можно попробовать "угадать" хендл (5 группа DXF) и по нему выцепить. А можно и не угадать. Перебором надежнее. Ну и еще есть метод GetAttributes.
Записать в переменные можно так
Код:
[Выделить все]
(foreach i (vlax-safearray->list (vlax-variant-value (vla-getattributes (vlax-ename->vla-object (car (entsel))))))
  (princ "\n")
  (princ (vla-get-tagstring i))
  (princ " = ")
  (princ (vla-get-textstring i))
  (set (read (vla-get-tagstring i)) (vla-get-textstring i))
)
Разумеется, четыре лишних строки только для визуализации примера
Проверяем
Цитата:
RRR = 44
QQQ = 55
; 1 form loaded from #<editor "<Untitled-0> loading...">
_$ rrr
"44"
_$ qqq
"55"
_$
vk вне форума  
 
Непрочитано 27.03.2006, 17:17
#181
Zouss


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


информация то favorite комментарии from all
Код:
[Выделить все]
(setq f_line (repeat 7 (read-line file_id)))
атрибуты в блоке будут располагаться в порядке их создания, так что ловя третий атрибут надо быть сильно уверенным в том, что нужный нам именно третий. так что если блок с атрибутом создается не программно я бы искал по тегу (2 dxf группа)
Zouss вне форума  
 
Непрочитано 27.03.2006, 17:23
#182
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от favorite
Помогите. При изучении возникли вопросы .
Пробую программу написать для спецификации арматуры.

Как из файла прочесть нужную строку командой read-line<...>
Я бы попробовал через DOSLib работать с ini-файлом - dos_setini и dos_getini соответственно. Это наверняка будет проще.

Цитата:
Сообщение от Zouss
информация то favorite комментарии from all
Код:
[Выделить все]
(setq f_line (repeat 7 (read-line file_id)))
атрибуты в блоке будут располагаться в порядке их создания, так что ловя третий атрибут надо быть сильно уверенным в том, что нужный нам именно третий. так что если блок с атрибутом создается не программно я бы искал по тегу (2 dxf группа)
Чуть-чуть не так, по-моему. Кажется, порядок запроса атрибутов задается при создании блока. По крайней мере, если щелкать на атрибутах последовательно, а не выбирать рамкой, то так и будет с точки зрения пользователя.
Я бы до значения атрибута добирался по его тэгу, честно говоря. Хотя и тут могут быть проблемы - а если тэги повторяются?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.03.2006, 18:48
#183
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,834
<phrase 1=


Цитата:
Помогите. При изучении возникли вопросы .
Пробую программу написать для спецификации арматуры.
Цитата:
Я бы попробовал через DOSLib работать с ini-файлом - dos_setini и dos_getini соответственно. Это наверняка будет проще.
>kpblc & favorite
Lisp язык списков, и функций работы со списками хватает практически для всех задач подобного класса.
И не надо лохматить бабушку!
Alan вне форума  
 
Непрочитано 27.03.2006, 19:04
#184
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


Цитата:
Сообщение от Alan
Lisp язык списков, и функций работы со списками хватает практически для всех задач подобного класса.
И не надо лохматить бабушку!
Во-во, создал списочек из строк файла, и добывай потом какой надо и обрабатывай как хошь. Для этого вот вам из копилки:
Код:
[Выделить все]
(defun APEL-FILE-READ (fname / str spis)
  (if (setq fname (open fname "r"))
    (progn
      (while (setq str (read-line fname))
	(setq spis (cons str spis))
      )
      (close fname)
      (reverse spis)
    )
  )
)
__________________
apel.fas
Apelsinov вне форума  
 
Непрочитано 27.03.2006, 19:08
#185
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,834
<phrase 1=


Цитата:
Apelsinov Во-во, создал списочек из строк файла, и добывай потом какой надо и обрабатывай как хошь...
А если списочек чуть-чуть структурированный...
Alan вне форума  
 
Непрочитано 27.03.2006, 19:42
#186
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Help
У меня есть список
Позиция Количество
1 2
1 3
1 3
2 4
3 3
3 3
-
-
n 5

Как сделать чтобы у меня выбор проходил и ссумировалось количество по всем позициям, для каждой позиции отдельно.
Причем как вы наверное поняли количество позиций, может быть очень большим. (требуется сумм для каждой позиции вывести.)
поэтому методом перебора, то ест


(cond (= 1....200 Позиция))
(setq Количество (1+ Количество))

не пройдет, так как необходимо каким-то образом менять имя
переменной.
Есть каке-то идеи. Как это можно реализовать?


ЧТо касается предыдущего вопроса.
Список действительно структурированный.
Поэтому я обощелся While и простым перебором строк.

Спасибо
favorite вне форума  
 
Непрочитано 27.03.2006, 20:49
#187
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от favorite
Help
У меня есть список
Позиция Количество
1 2
1 3
1 3
2 4
3 3
3 3
-
-
n 5

Как сделать чтобы у меня выбор проходил и ссумировалось количество по всем позициям, для каждой позиции отдельно.
.............
Есть каке-то идеи. Как это можно реализовать?
гхммм... Какая то странная у вас настроечная таблица :shock: (с) из Простоквашино
Что то ваш список не очень то на список похож... по крайней мере, на лисповский
Ну да ладно. Предположим, что это файл структурированый, c:\pos.txt .... Вот один из вариантов, не самый удачной, но все ж...
Код:
[Выделить все]
(defun test (/ f str lstsum)
  (setq f (open "c:\\pos.txt" "r"))
  
  (while (/= (setq str (read-line f)) "")
    (setq str (read (strcat "(" (vl-string-subst " . " " " str) ")")))
    (if (assoc (car str) lstsum)
      (setq lstsum
             (subst (cons (car str) (+ (cdr (assoc (car str) lstsum)) (cdr str)))
                    (assoc (car str) lstsum)
                    lstsum
             ) ;_  subst
      ) ;_  setq
      (setq lstsum (cons str lstsum))
    ) ;_  if
  ) ;_  while
  
  (close f)

  
  lstsum
) ;_  defun
Получаем что то вроде
Цитата:
_$ (test)
((3 . 21) (2 . 10) (1 . 19))
_$
vk вне форума  
 
Автор темы   Непрочитано 30.03.2006, 15:10
#188
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от mmax
Фланец готов полностью если не считать нажатие ЕSC во время указания точки.
И еще один БЭД не очень значительный.
Не буду приводить пока полностью всю программу суть проблемы можно извлечь отсюда:

Код:
[Выделить все]
(defun test (/ cpoint)

    (setq cpoint (getpoint "Укажите точку"))

(vl-cmdf "_circle" cpoint 19)
  
  )
(repeat 8  (test)) ; вместо 8 можно поставить любое число
Результат работы программы положительный вот только в Акаде 2006 в командной строке которая у курсора и в обычной строке при втором и теретьем вызове функции (test) функцией (repeat n (test)) выдается сообщение :

Код:
[Выделить все]
Can’ t  _reenter LISP ;это в обычной строке

Invalid point ; а это еще и в висячей у курсора
Укажите точку
В принципе, все то что предписывалось программе выполняется на 100% вот только Invalid point несколько портит картину своим присутствием. Как говорится результат получен да вот только осадок нехороший остался.
Почему вообще возникает такая проблема?
И почему точка получает инвалидность именно при втором и третьем запуске а при других запусках нет я пробовал (repeat 50 (test)) тоже только второй и третий раз.

Пробовал просто от балды

Код:
[Выделить все]
(defun test (/ cpoint)
  (setq testpoint (getpoint "testp"))
    (setq cpoint (getpoint "Укажите точку"))

(vl-cmdf "_circle" cpoint 19)
  
  )
(repeat 8  (test)) ; вместо 8 можно поставить любое число
здесь инвалидность давали только точке testpoint , а cpoint уже проходит без инвалидности.
Скажите как избавиться от инвалидности вообще.
И в конце концов удалось установить связь с инвалидностью и функцией VL-CMDF или COMMAND -- При повторном вызове функции TEST и вылазит это сообщение, в русской версии звучит так
Код:
[Выделить все]
Повторный вход в LISP невозможен.
Неверная точка
Что же всетаки делать ума не приложу.
mmax вне форума  
 
Непрочитано 30.03.2006, 16:02
#189
Кулик Алексей aka kpblc
Moderator

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


А если попробовать такое
Код:
[Выделить все]
(defun test (/ cpoint testpoint)
  (setq	testpoint (getpoint "testp : ")
	cpoint	  (getpoint "Click the point : ")
	) ;_ end of setq
  (if cpoint
    (command "_.circle" cpoint 20)
    ) ;_ end of if
  ) ;_ end of defun

(repeat 10 (test))
В английском 2005 пашет без вопросов
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.03.2006, 18:51
#190
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


mmax
Вот пример отрисовки через ActiveX, попробуйте это, врядли будут лишние шептанья:
Код:
[Выделить все]
(defun test (/ cpoint)
  (if (setq cpoint (getpoint "\nУкажите точку"))
    (APEL-DRAW-CIRCLE (trans cpoint 1 0) 19)
  )
)
;;;Отрисовка окружности
;;;point - точка (списком или вариантом)
;;;diam - диаметр (число)
(defun APEL-DRAW-CIRCLE	(point diam)
  (if (listp point)
    (setq point (vlax-3d-point point))
  )
  (APEL-CATCH-APPLY_NOMESS
    'vla-AddCircle
    (list
      (APEL-ACTIVE_SPACE)
      point
      (/ diam 2)
    )
  )
)
;Библиотечные
(defun APEL-CATCH-APPLY_NOMESS (func lst / msg_err)
  (if (null (VL-CATCH-ALL-ERROR-P (setq msg_err (VL-CATCH-ALL-APPLY func lst))))
    (cond (msg_err msg_err)(T))
  )
)
;;;Текущее пространство
(defun APEL-ACTIVE_SPACE ()
  (apply
    (if	(and (zerop (vla-get-activespace (APEL-ACTIVE_DOCUMENT)))
		    (APEL-TRUE_FALSE-T_NIL
		      (vla-get-mspace (APEL-ACTIVE_DOCUMENT))
		    )
	)
      'vla-get-paperspace
      'vla-get-modelspace
    )
    (list (APEL-ACTIVE_DOCUMENT))
  )
)
(defun APEL-ACTIVE_DOCUMENT ()
  (if (null *apel_active_document*)
    (setq *apel_active_document*
	   (vla-get-activedocument
	     (APEL-ACAD_APPLICATION)
	   )
    )
    *apel_active_document*
  )
)
(defun APEL-ACAD_APPLICATION ()
  (if (null *apel_acad_application*)
    (setq *apel_acad_application* (vlax-get-acad-object))
    *apel_acad_application*
  )
)
Самое тяжелое тут собрать все библиотечные - надеюсь, я ничего не забыл. :roll:

Alan
Цитата:
А если списочек чуть-чуть структурированный...
А пофигу, все равно все строчками читается, а вот их уже обрабатывать в зависимости от структуры....
__________________
apel.fas
Apelsinov вне форума  
 
Автор темы   Непрочитано 30.03.2006, 21:00
#191
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


А вообщето мне надо правильный многоугольник
окружность можно построить с помощью ENTMAKE тогда рычать не будет.
А вот многоугольник так просто с помощью ENTMAKE не построить, надо сначала найти координаты вершин. В отличии от команды POLIGON там нет центра описывающей окружности хотя есть количество вершин. :?
mmax вне форума  
 
Непрочитано 31.03.2006, 10:37
#192
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


mmax
Любой акадовский примитив можно вставить в текущее пространство лиспом, как известно тремя способами:
1. Через command (или лучше vl-cmdf)
2. Через entmake.
3. Методами ActiveX.
У каждого способа свои полюсы и минусы.
Не стоит путать КОММАНДЫ и ПРИМИТИВЫ. Нет примитива - МНОГОУГОЛЬНИК - есть примитив ПОЛИЛИНИЯ (и 3 ее разновидности).

То есть нарисовать многоугольник полилинией вы можете любым вышеперечисленным способом, однако для отрисовки 2-мя последними вам придется рассчитать координаты вершин.
__________________
apel.fas
Apelsinov вне форума  
 
Непрочитано 31.03.2006, 10:39
#193
Zouss


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


а че их рассчитывать то? попросим у пользователя (или у своей функции) координаты его центра и через (polar pt ang dist) все найдем
Zouss вне форума  
 
Непрочитано 31.03.2006, 10:47
#194
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


Zouss
А вы думаете я говоря "расчитать" что имел ввиду? Это же.
Но вот что Вы там у пользователя запрашивать станете, и станете ли - это уже зависит от конкретных целей.
__________________
apel.fas
Apelsinov вне форума  
 
Автор темы   Непрочитано 01.04.2006, 14:09
#195
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от Apelsinov
mmax
Любой акадовский примитив можно вставить в текущее пространство лиспом, как известно тремя способами:
1. Через command (или лучше vl-cmdf)
2. Через entmake.
3. Методами ActiveX.
У каждого способа свои полюсы и минусы.
Не стоит путать КОММАНДЫ и ПРИМИТИВЫ. Нет примитива - МНОГОУГОЛЬНИК - есть примитив ПОЛИЛИНИЯ (и 3 ее разновидности).

То есть нарисовать многоугольник полилинией вы можете любым вышеперечисленным способом, однако для отрисовки 2-мя последними вам придется рассчитать координаты вершин.
Мне сам многоугольник не нужен мне нужны координаты его вершин,
Но если пользоваться командами то насколько я заметил команды выполняются правильно, но выводят сообщения об ошибках причем не только в вышеперечисленном случае -- такие вещи могут напугать пользователя.
А если найти координаты другим способом, то соответственно команды не понадобятся вообще.
Нарисовать многоугольник с помощью (command или vl-cmdf "_poligon") а потом с помощью entget получить координаты -- это путь наименьшего сопротивления.
Ну и соответственно если я не хочу видеть сообщения об инвалидных объектах, то от командного сценария придется отказаться.
mmax вне форума  
 
Автор темы   Непрочитано 03.04.2006, 11:10
#196
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Ну ладно с глюками разобрались.

Возникает новый вопрос. Как реализовать, хотябы даже на примере моего фланца, функцию вставки фланца так чтобы было видно что вставляем.
У меня два мнеия на этот счет

1. Фланец рисуется гденибудь, например на невидимом слое или слоях тк типы линий разные, полученные примитивы добавляются в набор, копируются с начальной точкой вставки, удаляются вместе со слоями, далее отдаем пользователю на растерзание команду вставки.

2. все тоже самое только из примитивов создаем блок, отдаем пользователю вставку блока, Если пользователь ткнул мышью, запоминаем точку вставки, и относительно точки вставки заново отрисовываем примитивы и удаляем блок.

??????????Я правильно мыслю???????????
mmax вне форума  
 
Непрочитано 03.04.2006, 11:22
#197
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от mmax
Если пользователь ткнул мышью, запоминаем точку вставки, и относительно точки вставки заново отрисовываем примитивы и удаляем блок.

??????????Я правильно мыслю???????????
Проще взорвать блок, если конечно оно надо.
vk вне форума  
 
Непрочитано 03.04.2006, 11:35
#198
Кулик Алексей aka kpblc
Moderator

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


ИМХО: Купить "САПР на базе" - там решение есть. Я не очень его понял, втупую скопировал и все.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.04.2006, 12:06
#199
Zouss


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


само красивше будет если сначала, в DCL то есть, будет картинка со схемкой фланца, где будет видно-понятно какой параметр для чего нужен
Потом создаем блок там где надо и натравливаем на него команду move - не надо ничего удалять и с перерисовкой на экране париться

точно так же можно поступить и с многоугольником - сначала запрашиваем у пользователя его центр и прочее, как в команде polygon; потом entmake его с использованием (polar pt ang dist), а потом rotate на него
Чтоб совсем обойтись без вызова (command... можно при запросе параметров отрисовывать многоугольник через grdraw, делая "визуальнее", но тогда у нас будет два почти одинаковых куска программы вычисляющих вершины многоугольника - один для (grdraw... другой для (entmake...

в общем тут главное не перемешивать, не чередовать куски кода разного назначения - сначала спросить все у пользователя все параметры объекта, потом создать его, потом помучить с расположением - и править удобно и вероятность необъяснимых ошибок меньше
Zouss вне форума  
 
Непрочитано 03.04.2006, 19:01
#200
aldt


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


Apelsinov Помогите:
сообщение apel-plot-format "не найден файл описания форматов, программа остановлена"
вопрос как создать "apel-plot-format.txt"
aldt вне форума  
 
Непрочитано 04.04.2006, 10:38
#201
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


Цитата:
Сообщение от aldt
Apelsinov Помогите:
сообщение apel-plot-format "не найден файл описания форматов, программа остановлена"
вопрос как создать "apel-plot-format.txt"
http://dwg.ru/forum/viewtopic.php?t=...=asc&start=144

Для создания файла, воспользуйтесь опцией File при запросе:
command: Specify first corner [File] <exit>:

НО! Еще раз предупреждаю - код размещен исключительно в ознакомительных целях, это не "готовая программа".
__________________
apel.fas
Apelsinov вне форума  
 
Непрочитано 04.04.2006, 11:15
#202
aldt


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


спасибо за ответ!
aldt вне форума  
 
Автор темы   Непрочитано 05.04.2006, 20:29
#203
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Господа, я тут гдето видел что можно читать LISPом диалоги созданые в VBA.
Для этого я создал форму коды пока не добавлял, загрузил полученый DVB файл, и проделал такую операцию.

Код:
[Выделить все]
(vl-load-com)
(defun acad_obj_s (/)
  (setq acad_app_s (vlax-get-acad-object)
	active_doc_s (vla-get-activedocument acad_app_s)
	mod_sp_s (vla-get-modelspace active_doc_s)
        pap_sp_s (vla-get-paperspace active_doc_s)       
	)
)
(acad_obj_samo)

(setq vbes (vla-get-vbe acad_app_s))

(vlax-dump-object vbes t)
и получил вот такой дамп
Код:
[Выделить все]
; VBE: nil
; Property values:
;   ActiveCodePane = nil
;   ActiveVBProject = #<VLA-OBJECT _VBProject 0e5f26a4>
;   ActiveWindow (RO) = nil
;   Addins (RO) = #<VLA-OBJECT _AddIns 0e5f21c4>
;   CodePanes (RO) = #<VLA-OBJECT _CodePanes 0de12c08>
;   CommandBars (RO) = #<VLA-OBJECT _CommandBars 0d4cfec8>
;   Events (RO) = #<VLA-OBJECT Events 0e5f2104>
;   MainWindow (RO) = #<VLA-OBJECT Window 0e5f2324>
;   SelectedVBComponent (RO) = #<VLA-OBJECT _VBComponent 0e5f5c64>
;   VBProjects (RO) = #<VLA-OBJECT _VBProjects 0e5f17b4>
;   Version (RO) = "6.03"
;   Windows (RO) = #<VLA-OBJECT _Windows 0e5f2184>
; No methods
Попробовал выполнить функцию без загрузки проекта
Заметил разницу в ActiveVBProject здесь оно равно nil

Код:
[Выделить все]
; VBE: nil
; Property values:
;   ActiveCodePane = nil
;   ActiveVBProject = nil
;   ActiveWindow (RO) = nil
;   Addins (RO) = #<VLA-OBJECT _AddIns 0e9e18a4>
;   CodePanes (RO) = #<VLA-OBJECT _CodePanes 0dde8fd8>
;   CommandBars (RO) = #<VLA-OBJECT _CommandBars 0d52fb60>
;   Events (RO) = #<VLA-OBJECT Events 0e9e17e4>
;   MainWindow (RO) = #<VLA-OBJECT Window 0e9e1a04>
;   SelectedVBComponent (RO) = nil
;   VBProjects (RO) = #<VLA-OBJECT _VBProjects 0e9e1794>
;   Version (RO) = "6.03"
;   Windows (RO) = #<VLA-OBJECT _Windows 0e9e1864>
; No methods
Вродебы я был не верном пути
Но на этом почемуто дальше хождение по иерархии закончилось
Нет функции (vla-get-ActiveVBProject)
Значит этот путь неверный.
Подскажите как достучаться до активного проекта??????????????
И вообще можно ли читать диалоги бейсика, если можно то стоит ли.
mmax вне форума  
 
Непрочитано 12.04.2006, 19:48
#204
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Я написал программу для работы которой требуется определенный блок с аттрибутом. Этот блок я копирую из файла вручную. Есть ли возможность чтобы при запуске моей программы этот блок автоматически или создавался, или просто вставлялся из файла вкотором он находится . Какие есть соображениея по этому поводу?

Еще вопрос можноли Entmake или средствами Activex создать блок с вложенными аттрибутами по коду как это сделать если есть пример скиньте, чтобы я мог посмотреть.

Спасибо.
favorite вне форума  
 
Непрочитано 12.04.2006, 21:13
#205
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Цитата:
Сообщение от favorite
Есть ли возможность чтобы при запуске моей программы этот блок автоматически или создавался, или просто вставлялся из файла вкотором он находится.
Такая возможность есть
Цитата:
Еще вопрос можноли Entmake или средствами Activex создать блок с вложенными аттрибутами по коду как это сделать если есть пример скиньте, чтобы я мог посмотреть.
Здри! [sm2001]
Код:
[Выделить все]
((defun BlkIns (blk_n ins_pt bk_prp att_val / adoc blk tags)
  (setq adoc (vla-get-ActiveDocument (vlax-get-acad-object)))
  (setq blk (vla-insertBlock
	      (vlax-get-property adoc (if (= (getvar "CVPORT") 1) 'PaperSpace 'ModelSpace))
	      (vlax-3d-point ins_pt)
	      (strcat (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-item (list (vla-get-blocks adoc) bn))) "PATH\\" "") blk_n)
	      1 1 1 0));setq
  (mapcar '(lambda (x y) (vlax-put-property blk x y)) '(Layer Color XscaleFactor YScaleFactor ZScalefactor Rotation) bk_prp)
  (if (= (vla-get-HasAttributes blk) :vlax-true) (progn
      (foreach at (vlax-invoke blk 'Getattributes) (setq tags (cons ((vla-get-TagString at) "*TAG*") tags)))
      (mapcar '(lambda (x y z) (if (= (vla-get-TagString x) y) (vla-put-TextString x z))) ats tags att_val)));if
);defun
Цитата:
Спасибо.
Пжалста!
Лентяй вне форума  
 
Непрочитано 13.04.2006, 19:50
#206
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Решил я поинтересоваться , кто пользуется OBjectDCL.
Вчера я поставил, начал разбираться,просто здоро, я нашел версию 3.0 . Правда выскакивает надпись в CAdе "This dialog block was created using an evaluation version of objectDCL"/ Что это такое и как сделать чтобы не выскакивало.

Не знаю может есть более поздняя.
Может ссылки на какую-нибудь литературу на русском у кого есть, а то закалибался по их справке изучать. Хотя не плохо получается и по англ справке.

И еще не могу понять для чего в ActiveX нужны варианты ,как их использовать. Кроме VLax-3D-point Не могу придумать применения другим. :?:
favorite вне форума  
 
Непрочитано 13.04.2006, 22:58
#207
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


>Лентяй , а чего-нибудь попроше нельзя придумать, как-то сложно ничего не понял . Желательно только на Лиспе без ActiveX в нем еще плохо разобрался. ПРосто скажите как вставить нужный блок из файла в новый файл. Желательно с объяснением. А то я не долго этим занимаюсь, даже всех функций не знаю.
favorite вне форума  
 
Непрочитано 14.04.2006, 08:01
#208
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Цитата:
Сообщение от favorite
>Лентяй , а чего-нибудь попроше нельзя придумать, как-то сложно ничего не понял . Желательно только на Лиспе без ActiveX в нем еще плохо разобрался. ПРосто скажите как вставить нужный блок из файла в новый файл. Желательно с объяснением. А то я не долго этим занимаюсь, даже всех функций не знаю.
Куда уж проще-то? ActiveX тем и отличается выгодно от AutoLISP, что в нем все сказано In Plain English. Впрочем, если у кого с английским проблемы, тады, оно, конечно, ой. А потому - приступим, благословясь, к разжевывынию.
Код:
[Выделить все]
(defun BlkIns (blk_n ins_pt bk_prp att_val / adoc blk tags)
blk_n - Block name - имя блока (строка);
ins_pt - Insertion Point - точка вставки (список из 3-ч координат);
blk_prp - Block properties - свойства блока - список;
att_val - Attribute Values - значения атрибутов (список)
adoc - Active Document - открытый чертеж (объект)
blk - Block - блок, с которым работаем (объект)
Код:
[Выделить все]
(setq adoc (vla-get-ActiveDocument (vlax-get-acad-object)))
Входим в открытый чертеж
Код:
[Выделить все]
(setq blk (vla-insertBlock
Это, надеюсь, понятно
[/code]
Код:
[Выделить все]
(vlax-get-property adoc (if (= (getvar "CVPORT") 1) 'PaperSpace 'ModelSpace))
Исходя из значения переменной "CVPORT" определяем, в какое пространство - Листа (Paper Space) или Модели (Model Space)вставлять блок
Код:
[Выделить все]
(vlax-3d-point ins_pt)
Преобразовываем список координат в формат ActiveX
Код:
[Выделить все]
(strcat (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-item (list (vla-get-blocks adoc) bn))) "PATH\\" "") blk_n)
Если мия блока не входит в коллекцию блоков чертежа (vla-get-blocks adoc), приписываем к файлу блока его "адрес".
Код:
[Выделить все]
1 1 1 0));setq
Присваиваем масштабам по X,Y и Z, а также углу поворота значения по умолчанию, потому как все равно будем их менять.
Код:
[Выделить все]
(mapcar '(lambda (x y) (vlax-put-property blk x y)) '(Layer Color XscaleFactor YScaleFactor ZScalefactor Rotation) bk_prp)
Присваиваем перечисленным свойствам (Property) блока, названия которых, надеюсь, переводить не надо, заранее заданные значения, указанные в списке blk_prp.
Код:
[Выделить все]
(if (= (vla-get-HasAttributes blk) :vlax-true) (progn
Если блок имеет атрибуты, то...
Код:
[Выделить все]
(foreach at (vlax-invoke blk 'GetАttributes) (setq tags (cons ((vla-get-TagString at) "*TAG*") tags)))
Вытаскиваем из блока опреления атрибутов и составляем из их "ярлыков" (Tag), список.
Код:
[Выделить все]
(mapcar '(lambda (x y z) (if (= (vla-get-TagString x) y) (vla-put-TextString x z))) ats tags att_val)));if
Каждому атрибуту в соответствии с его "ярлыком" присваиваем заранее заданное значение, указанные в списке att_val.
Код:
Вытыраем пот и испытываем чувство глубокого удовлетворения.
Лентяй вне форума  
 
Непрочитано 14.04.2006, 18:17
#209
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Большое спасибо. Надо попробовать что-то такое написать.
ПРОГРАММА построения круга по координатам с диалоговым окном

Код:
[Выделить все]
(DEFUN c:prOG ()
  
(Odcl_Form_CloseAll  1)
(Odcl_LoadProject  "c:\\TErq2.ODC" T)
 



  (Odcl_Form_Show Ds)
(Odcl_Control_SetText TErq_Ds_TextBox1 0 [as String])
  (Odcl_Control_SetText TErq_Ds_TextBox2 0 [as String])
  (Odcl_Control_SetText TErq_Ds_TextBox3 0 [as String])

(VL-LOAD-COM)
(SETQ  MODEL (VLA-GET-MODELSPACE(vLA-GET-ACTIVEDOCUMENT (VLAX-GET-ACAD-OBJECT))))

(defun c:Ds_TXTOK_OnClicked ()
 (Setq x (ATOF(Odcl_Control_GetText TErq_Ds_TextBox1)))  
 (Setq y (ATOF(Odcl_Control_GetText TErq_Ds_TextBox2)))    
 (SETQ rADIUS (ATOF(Odcl_Control_GetText TErq_Ds_TextBox3)))
(SETQ pt1 (VLAX-3d-POINT  x y))

 (Odcl_Control_SetText TErq_Ds_TextBox1 0 [as String])
  (Odcl_Control_SetText TErq_Ds_TextBox2 0 [as String])
  (Odcl_Control_SetText TErq_Ds_TextBox3 0 [as String])
  (Odcl_Form_Close Ds)
  (SETQ stATUS t)
  (VLA-ADDCIRCLE model pt1 rADIUS)
  )
  

  (defun c:Ds_TextButton1_OnClicked ()
(Odcl_Form_Close Ds)
    (SETQ stATUS NIL)
    )
(defun c:Ds_OnCancelClose (bUserPressedEsc)

  (SETQ STATUS NIL)
  (Odcl_Form_Close Ds)
)
  (WHILE (= T sTATUS)
    (Odcl_Form_Show Ds)
   )

)
Посмотрите кто ObjectDCL знает, почему-то круги строит только после завершения задачи а не после закрытия формы. Как можно решить .
favorite вне форума  
 
Непрочитано 16.04.2006, 11:11 Привет
#210
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Попробуй сделать в форме еще одну кнопку, типа применить.
В неё забей команду по построению круга с введенными данными.
Кстати у тебя ObjectDCL демо или лицензионная.
Вот пример отрисовки сетки. (использует блок спецификации, так что программу надо запукать из приложенного файла или внедрить блок спецификации в новый файл)
Архи закидывать не буду. Тестировалось на 2006 Автокаде (русская версия)
[ATTACH]1145171518.rar[/ATTACH]
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 16.04.2006, 11:48
#211
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Насколько я понял демоверсия , иначебы надпись не показывала при загрузке окна. По поводу еще одной кнопки я не очень понял, у меня есть кника Полещук Разработка приложений настройка и адаптация , там есть пример вроде бы я правильно понял, но почему-то не срабатывает.

Также пробую программу для расстановки свай написать. Почему-то при нажатии на кнопу graphicbutton программа то нормально срабатывает то вообще не срабатывает и CAD вырубает,пишет ошибка C++ итд, из-за чего это происходит понять не могу.


Код:
[Выделить все]
; Программа расстановки свай
; Автор Зурабян Давид Артемович
(Defun C:SVAI
(Odcl_Form_CloseAll  1)
(Odcl_LoadProject  "c:\\SVAI.ODC" T)
(Odcl_Form_Show СВАИ_DclForm1 )
  
(defun c:DclForm1_GraphicButton1_OnClicked ()
(Odcl_Form_Close СВАИ_DclForm1)
  (setq PT1 (getpoint "введите точку 1:"))
  (terpri)
  (setq PT2 (getpoint "Введите точку 2:"))
  (setq DIST (/(distance PT1 PT2)1000))
  (SETQ STATUS t)
)
(defun c:DclForm1_OK_OnClicked ()
(Setq Value1 (Odcl_Control_GetValue SVAI_DclForm1_SVA6))
  (initget 7)
(Setq NESSV (atoI(Odcl_Control_GetText СВАИ_DclForm1_TextBox1)))
(Setq NAGR (+(* (atoI(Odcl_Control_GetText СВАИ_DclForm1_TextBox2)) 1.4) 0.8))
(setq KOLVO (fix (+ (* (/ NAGR NESSV)disT)1 )))
(setq SHAG (/ dist KoLVO))
  (Odcl_Form_Close СВАИ_DclForm1)
  (setq STATUS T)
(VL-LOAD-COM)
(SETQ  MODEL (VLA-GET-MODELSPACE(vLA-GET-ACTIVEDOCUMENT (VLAX-GET-ACAD-OBJECT))))
(setq i 1)
  (while  (<= i KOLVO)
  (Setq PT (Polar PT1 (angle PT1 PT2) (* SHAG i)))
	(setq i (1+ i))
	 (SETQ PT (vlax-3d-point PT))
(setq NAB1 (vla-insertBlock MODEL "SVAI6" PT 1.0 1.0 1.0 0))
  )
  )
(defun c:DclForm1_OnCancelClose (bUserPressedEsc /)
     (Odcl_Form_Close СВАИ_DclForm1)
  (setq STATUS nil)
  )

  (WHILE (= STATUS T)
  (Odcl_Form_Show СВАИ_DclForm1 ))
  )
Так-же какая-то проблема при создании варианта
Код:
[Выделить все]
 (SETQ PT (vlax-3d-point PT))
Но это ладно разберусь , а вот почему то работает ,а то сбой в CAD вызывает вот это не понятно.
[ATTACH]1145193300.rar[/ATTACH]
favorite вне форума  
 
Непрочитано 17.04.2006, 09:46 Привет
#212
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Ну конечно у меня ДЕМО-версия программы.
А у вас Лицензионка?
Скиньте мне полную версию вашего приложния с файлами ObjectDCL.
Попробую поковыряться.
Правда Я и сам то недавно этим начал заниматься.
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 17.04.2006, 20:00 Re: Привет
#213
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Цитата:
Сообщение от DEM
Ну конечно у меня ДЕМО-версия программы.
А у вас Лицензионка?
Скиньте мне полную версию вашего приложния с файлами ObjectDCL.
Попробую поковыряться.
Правда Я и сам то недавно этим начал заниматься.
У меня DEmo а программа в архиве. Что не скачивается?
favorite вне форума  
 
Непрочитано 01.04.2008, 12:32
#214
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Может было уже где.. Как сделать кнопку которая имитирует нажатие "ESC"? Возможно ли это вообще?
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 01.04.2008, 12:35
#215
Кулик Алексей aka kpblc
Moderator

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


Одно нажатие Esc:Два:Ну и так далее.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 01.04.2008, 12:58
#216
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Одно нажатие Esc:
^C
Два:
^C^C
Ну и так далее.
Как ни странно не работает. Или я не правильно объяснил... допустим я выделил несколько примитивов. Хочу отменить выделение. Жму ESC кнопку - а нужно сделать кнопку для лентяя в одно нажатие "отмены" на какой либо панели.

^C^C - отменяет команду любую, но не отменяет выделение
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 01.04.2008, 13:01
#217
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Как вариант сделал по глупому так
Код:
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 01.04.2008, 13:15
#218
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
(sssetfirst nil nil)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 01.04.2008, 14:33
#219
VVA

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


Пока лентяй будет наматывать километры, двигая мышку с текущей позиции курсора до кнопки и обрато, не лучше ли ему кликнуть правой кнопрой мыши и выбрать "Отменить выбор". Побереги экран для более полезных кнопок.
Миниатюры
Нажмите на изображение для увеличения
Название: Deselect.jpg
Просмотров: 100
Размер:	53.1 Кб
ID:	4875  
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 01.04.2008, 16:26
#220
Zouss


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


как вариант можно заглянуть в меню и узнать как эту кнопку делал любимый разработчик:
Код:
[Выделить все]
^C^C^P(ai_deselect) ^P
Zouss вне форума  
 
Непрочитано 01.04.2008, 17:20
#221
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Цитата:
Сообщение от VVA Посмотреть сообщение
Пока лентяй будет наматывать километры, двигая мышку с текущей позиции курсора до кнопки и обрато, не лучше ли ему кликнуть правой кнопрой мыши и выбрать "Отменить выбор". Побереги экран для более полезных кнопок.
С этим я вкурсе - но это 2 щелчка мышью

Zouss, спасибо за подсказку чего-то тормознул и не поискал хорошо. Хотя искал...
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 01.04.2008, 17:36
#222
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Еще проблемка-вопросик: Нужно нарисовать точку из штриховки.
Делаю я ее так:
Код:
[Выделить все]
^C^C_circle;\_d;1.25;_-bhatch;_s;_l;;_p;SOLID;;
но мне нужно удалить окружность которая была создана для штриховки.
Как это проделать?
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 01.04.2008, 17:54
#223
Zouss


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


Shoorup, чем вам не нравится команда Donut?
Код:
[Выделить все]
^C^C_Donut;0;1.25
если же программным путем, то сразу после создания окружности сохраняем ее имя
Код:
[Выделить все]
(setq cname (entlast))
и после выполнения всех необходимых операций удаляем ее
Код:
[Выделить все]
(entdel cname)
Zouss вне форума  
 
Непрочитано 01.04.2008, 18:08
#224
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Zouss, Donut в процессе эксплуатации не оправдал себя. 1.я причина: при растягивании некоторых объектов иногда захватывается точка и получается квадратное кольцо - что ни есть гуд. 2.я причина: при использовании привязки иногда привязывается к маркеру не к тому которому надо. У Donutа их 4 и расположены они не так как хотелось бы, а у штриховки один маркер и точно по центру - что очень удобно.
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 01.04.2008, 18:21
#225
VVA

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


Пробуй так
Код:
[Выделить все]
 
^C^C_circle;\_d;1.25;(setq en (entlast));_-bhatch;_s;_l;;_p;SOLID;;_erase;!en;;
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 01.04.2008, 18:29
#226
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Zouss, Спасибо еще раз
VVA, сделал так:
Код:
[Выделить все]
^C^C_circle;\_d;1.25;(setq c125 (entlast));_-bhatch;_s;_l;;_p;SOLID;;(entdel c125);
у меня 3 кнопки (1, 1.25, 1.5)
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 01.04.2008, 18:29
#227
VVA

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


Еще вариант без лиспа
Код:
[Выделить все]
^C^C_expert;5;_circle;\_d;1.25;_-group;_c;tmp;;_l;;_-bhatch;_s;_l;;_p;SOLID;;_erase;_g;tmp;;
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 01.04.2008, 18:41
#228
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


VVA, изящно!
Не понял только как работает и для чего переменная _expert - 5?
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 01.04.2008, 18:41
#229
Кулик Алексей aka kpblc
Moderator

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


А, может, как-нибудь так?
Код:
[Выделить все]
(defun c:myhatch (/ pt adoc ent hatch locked)
  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-StartUndoMark
  (if (= (type (setq pt
                      (vl-catch-all-apply
                        '(lambda ()
                           (trans (getpoint "\nУкажите центр <Отвали, без тебя тошно> : ")
                                  1
                                  0
                                  ) ;_ end of trans
                           ) ;_ end of lambda
                        ) ;_ end of vl-catch-all-apply
                     ) ;_ end of setq
               ) ;_ end of type
         'list
         ) ;_ end of =
    (progn
      (setq locked (vla-get-lock (vla-get-activelayer adoc)))
      (vla-put-lock (vla-get-activelayer adoc) :vlax-false)
      (setq ent (vla-addcircle
                  (vla-get-modelspace adoc)
                  (vlax-3d-point pt)
                  1.25
                  ) ;_ end of vla-AddCircle
            ) ;_ end of setq
      (setq hatch (vla-addhatch
                    (vla-get-modelspace adoc)
                    achatchpatterntypepredefined
                    "SOLID"
                    :vlax-false
                    ) ;_ end of vla-AddHatch
            ) ;_ end of setq
      (vla-appendouterloop
        hatch
        (vlax-make-variant
          (vlax-safearray-fill
            (vlax-make-safearray
              vlax-vbobject
              '(0 . 0)
              ) ;_ end of vlax-make-safearray
            (list ent)
            ) ;_ end of vlax-safearray-fill
          ) ;_ end of vlax-make-variant
        ) ;_ end of vla-AppendOuterLoop
      (vla-evaluate hatch)
      (vla-erase ent)
      (vla-regen adoc acallviewports)
      (if locked
        (vla-put-lock (vla-get-activelayer adoc) locked)
        ) ;_ end of if
      ) ;_ end of progn
    ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
Хотя лично я создавал бы блок и не мучался.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 01.04.2008, 18:50
#230
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Кулик Алексей aka kpblc, отличный макрос
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 01.04.2008, 19:10
#231
VVA

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


Цитата:
Сообщение от Shoorup Посмотреть сообщение
VVA, изящно!
Не понял только как работает и для чего переменная _expert - 5?
На запрос "Выбарите объеткы" помимо _all; _last можно отвечать _group (группа)ю Будет выбрана именованная группа.
  • ^C^C - это понятно
  • _expert;5; - Подавляет запрос “Это имя уже используется; переопределить его?” (вдруг группа с именем tmp существует?) Считается, что по умолчанию ответили "Да"
  • _circle;\_d;1.25; - рисуем круг
  • _-group;_c;tmp;;_l;; - создаем группу TMP и запихиваем в нее круг
  • _-bhatch;_s;_l;;_p;SOLID;; - рисуем штриховку
  • _erase;_g;tmp;; - удаляем опцией группа (_g) группу tmp
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 02.04.2008, 09:23
#232
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Еще вопрос:
Не очень понимаю как работает ^P. В каких случаях это будет работать, а в каких нет?

Как в макросах можно подавить запросы в командной строке?
__________________
Поезд который устал от ржавого здравомыслия рельсов...

Последний раз редактировалось Shoorup, 02.04.2008 в 09:45.
Shoorup вне форума  
 
Непрочитано 02.04.2008, 09:26
#233
VVA

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


^P - аналог в меню переменной MENUECHO
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 02.04.2008, 09:43
#234
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


VVA, справку умею открывать - пасибо.
Вопрос не в том что это, а как это работает?
Выдержка из справки для переменной MENUECHO:
Цитата:
Устанавливает битовый код управления эхо-выводом и запросами меню . Код является суммой следующих значений:
1-Подавляет эхо-вывод пунктов меню (переключатель в меню ^P)
2-Подавляет системные запросы во время выполнения команд из меню
4-Подавляет переключателя ^P эхо-вывода пунктов меню
8-Отображает все выводимые и вводимые строки (режим отладки для макросов DIESEL)
Если честно то ничего не понял. Что будет происходить при изменениии переменной? Что за "пункты меню"? Данная переменная работает только с Дизелем?
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 02.04.2008, 10:29
#235
Zouss


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


эхо-вывод в командную строку, меню в acad это ведь ничего особенного, просто оно (меню) пишет то что нужно в командную строку вместо вас и гораздо быстрее
MENUECHO или ^p это чисто косметика
работает не только с diesel, но и вообще. просто иногда при отладке макросов бывает нужно посмотреть, что же все таки происходит, вот и включаем отображение всех запросов, даже тех на которые сам макрос и отвечает
Zouss вне форума  
 
Непрочитано 02.04.2008, 20:50
#236
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,288


19-02-06 ММАХ сказал
Цитата:
Гопода, я начал этим заниматься совсем недавно, буквально в этом месяце. И у меня уже есть грандиозные планы например:...
Через 3 дня исполнится 2 года с его последнего сообщения в этой теме. Интересно, как продвинулоь программирование у него за это время?
Vova вне форума  
 
Непрочитано 02.04.2008, 21:32
#237
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Я следующий "ученик" по программированию на Lisp
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 04.04.2008, 20:19
#238
Kline_Kinder

проектант
 
Регистрация: 31.01.2007
город-Герой ОДЕССА
Сообщений: 26


Люди, помогите чайнику, а?
Наваял когда-то, при неоценимой помощи форумчан программулину.
Она долго работала, радость приносила.
Так долго, что я ее и подзабывать начал.
Потом сменили кад, я подгрузил ее, но программулина работать перестала.
Файл с прогой старый, и не отлажен (конечный вариант не сохранил- да знаю кто я...).
Может это и старая версия, не без багов. Но те баги я хоть и смутно но помню.
Вроде их поправил
Но прога стала выдавать непонятное сообщение в редакторе (окно консоль VL):
$
; ошибка: unknown format directive: "["
А такой не было, это точно.

Я точно помню что раньше хоть в проге и и были дурацкие ошибки, но такой мессаги она мне не давала!

Кстати символа "[" в тексте проги нет совсем!

Да и еще. Кусочки проги проверка пропускает, в комстроку када они лезут без матюков, а при выполнении функции кад пишет что она не определена, хотя съедает ее без претензий!
Если надо текст проги выложу (он махонький), просто чтоб здесь не пачкать..., может есть простой моментальный ответ на вопрос что значит это сообщение, и как это лечится?
Спасибо!

Последний раз редактировалось Kline_Kinder, 04.04.2008 в 20:33.
Kline_Kinder вне форума  
 
Непрочитано 04.04.2008, 20:48
#239
Кулик Алексей aka kpblc
Moderator

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


Подобное бывало на официальных локализациях AutoCAD 2005 (как с сервис-паком, так и без) и на 2006 (без сервис-пака). На последующих вроде не было.
Выкладывать код лично я особого смысла не вижу - ошибка самого AutoCAD'a (спасибо кривым ручкам локализаторов). Решение на caduser.ru Profan выкладывал - оно сводилось к редактированию штатных dll.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 04.04.2008, 23:09
#240
Kline_Kinder

проектант
 
Регистрация: 31.01.2007
город-Герой ОДЕССА
Сообщений: 26


Спасиб! Буду смотреть. Только вот ковырять штатную д-библ. честно скажу- страшно.
Да. кад поставили мне -2007 рус
Kline_Kinder вне форума  
 
Непрочитано 04.04.2008, 23:22
#241
Кулик Алексей aka kpblc
Moderator

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


Установи (на всяк случай) service-pack - возможно, ошибка исчезнет.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 04.04.2008, 23:34
#242
Kline_Kinder

проектант
 
Регистрация: 31.01.2007
город-Герой ОДЕССА
Сообщений: 26


Нет его . Есть старый кад.
Начальству выскажу ФЭ, пусть ищет SP
Устанавливаю счас старый кад, а план местности по данным с буссоли буду чертить уже завтра.
Спасибо, за то что наставили на путь истинный. То что это не мой баг, избавляет от штудирования основательно подзабытой инфы о лиспе .
Еще раз спасибо.
Kline_Kinder вне форума  
 
Непрочитано 05.04.2008, 02:37
#243
Кулик Алексей aka kpblc
Moderator

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


А чего его искать-то, этот service-pack? Вот оно
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.04.2008, 19:45
#244
Kline_Kinder

проектант
 
Регистрация: 31.01.2007
город-Герой ОДЕССА
Сообщений: 26


Вай спасибо! Вы всегда помогаете.
Kline_Kinder вне форума  
 
Непрочитано 07.04.2008, 17:38
#245
Kline_Kinder

проектант
 
Регистрация: 31.01.2007
город-Герой ОДЕССА
Сообщений: 26


Новости
SP2 для 2007рус- ошибку не исправил
SP для 2005рус- ошибку не исправил (монтировал 2005+SP поверх 2007р)
Монтаж 2008 (англ)- ошибки нет, прога работает !
Спасибо!
Я сюда наверняка загляну, по-этому напишите если прога кому-нить нужна.
Прога чертит характерные точки плана местности, по данным полученным при съемке артиллерийской буссолью ПАБ-2Б
Kline_Kinder вне форума  
 
Непрочитано 07.05.2008, 13:28
#246
ALFMario


 
Регистрация: 11.10.2007
Gomel
Сообщений: 68


Надо начертить линию р1 р2 Координату p1 получаю через getpoint , точку p2 следующим оброзом
(setq p2 (vlax-curve-getclosestpointto (vlax-ename->vla-object (car ent)) p1) )
Теперь через команду (command "_line" p1 p2 "")... ничего не получаетья
и через (vl-cmdf "_line" p1 p2 "")... вроде понимаю что чего то не хватает а вот чего не знаю... подскажите как правильно сделать пожалста
ALFMario вне форума  
 
Непрочитано 07.05.2008, 13:36
#247
VVA

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


1.
vlax-curve-* принимают и возвращают координату в МСК (WCS)
getpoint, entsel и command - в ПСК (UCS) (наводка: trans)
2. Отключить привязки (OSMODE) или так
(command "_line" "_non" p1 "_non" p2 "")
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 07.05.2008, 13:48
#248
Рyslan


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


Всем привет. Посоветуйте нормальную литературу по lisp. Купил себе Полещука, написано много, только вот как-то справочно. Он по-моему вообще книги писать не умеет.
Рyslan вне форума  
 
Непрочитано 07.05.2008, 16:10
#249
ALFMario


 
Регистрация: 11.10.2007
Gomel
Сообщений: 68


Кода такой (код кажеться kpblc писал) хочу сделать для себя... но не получаеться, должен рисоваться перпендикуляр к выбранной линии до точки... не получаеься ничего... возрващает тока значение точки и все..
больше ничего сделать не могу... не понимаю... помогиет плз
(defun C:test (/ ent p1 p2)
(vl-load-com)
(if
(and
(= (type
(setq
ent (vl-catch-all-apply
'(lambda ()
(entsel
"\nВыбрать объект (линия) <Выход> : "
) ;_ end of entsel
) ;_ end of lambda
) ;_ end of vl-catch-all-apply
) ;_ end of setq
) ;_ end of type
'list
) ;_ end of =

(= (type
(setq p1
(vl-catch-all-apply
'(lambda ()
(cond
((getpoint
"\n Точка <или последнее> : "
) ;_ end of getpoint
)
(t (cadr ent))
) ;_ end of cond
) ;_ end of lambda
) ;_ end of vl-catch-all-apply
) ;_ end of setq
) ;_ end of type
'list
) ;_ end of =

) ;_ end of and


(setq p2 (trans (vlax-curve-getclosestpointto (vlax-ename->vla-object (car ent)) p1) 1 0)


) ;_ end of setq
(command "_line" "_non" p1 "_non" p2 "")


) ;_ end of if
) ;_ end of defun
ALFMario вне форума  
 
Непрочитано 07.05.2008, 16:16
#250
VVA

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


Про progn в IF забыл
Код:
[Выделить все]
(defun C:test (/ ent p1 p2)
  (vl-load-com)
  (if
    (and
      (= (type
           (setq
             ent (vl-catch-all-apply
                   '(lambda ()
                      (entsel
                        "\nВыбрать объект (линия) <Выход> : "
                      ) ;_ end of entsel
                    ) ;_ end of lambda
                 ) ;_ end of vl-catch-all-apply
           ) ;_ end of setq
         ) ;_ end of type
         'list
      ) ;_ end of =

      (= (type
           (setq p1
                  (vl-catch-all-apply
                    '(lambda ()
                       (cond
                         ((getpoint
                            "\n Точка <или последнее> : "
                          ) ;_ end of getpoint
                         )
                         (t (cadr ent))
                       ) ;_ end of cond
                     ) ;_ end of lambda
                  ) ;_ end of vl-catch-all-apply
           ) ;_ end of setq
         ) ;_ end of type
         'list
      ) ;_ end of =

    ) ;_ end of and
    (progn
     (setq p2 (trans (vlax-curve-getclosestpointto
                       (vlax-ename->vla-object (car ent))
                       p1
                     ) ;_ end of vlax-curve-getclosestpointto
                     1
                     0
              ) ;_ end of trans
     ) ;_ end of setq
     (command "_line" "_non" p1 "_non" p2 "")
    )
  ) ;_ end of if
) ;_ end of defun
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 07.05.2008, 16:34
#251
ALFMario


 
Регистрация: 11.10.2007
Gomel
Сообщений: 68


2VVA. Не подумал что надо, но и не понимаю почему progn стоит не сразу после IF. Подскажи еще как вставлять код лиспа как у тебя.
ALFMario вне форума  
 
Непрочитано 07.05.2008, 17:02
#252
VVA

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


Нажимаешь на # , появляются тэги
Цитата:
[code]
Здесь код лиспа
[/code]
Или набираешь их ручками
По поводу IF
(IF <УСЛОВИЕ> <УСЛОВИЕ=ИСТИНА> <УСЛОВИЕ=ЛОЖЬ>)
Конструкцию IF тоже расткасил в эти же цвета
Код:
[Выделить все]
  (if

    (and
      (= (type
           (setq
             ent (vl-catch-all-apply
                   '(lambda ()
                      (entsel
                        "\nВыбрать объект (линия) <Выход> : "
                      ) ;_ end of entsel
                    ) ;_ end of lambda
                 ) ;_ end of vl-catch-all-apply
           ) ;_ end of setq
         ) ;_ end of type
         'list
      ) ;_ end of =

      (= (type
           (setq p1
                  (vl-catch-all-apply
                    '(lambda ()
                       (cond
                         ((getpoint
                            "\n Точка <или последнее> : "
                          ) ;_ end of getpoint
                         )
                         (t (cadr ent))
                       ) ;_ end of cond
                     ) ;_ end of lambda
                  ) ;_ end of vl-catch-all-apply
           ) ;_ end of setq
         ) ;_ end of type
         'list
      ) ;_ end of =

    ) ;_ end of and


    (progn
     (setq p2 (trans (vlax-curve-getclosestpointto
                       (vlax-ename->vla-object (car ent))
                       p1
                     ) ;_ end of vlax-curve-getclosestpointto
                     1
                     0
              ) ;_ end of trans
     ) ;_ end of setq
     (command "_line" "_non" p1 "_non" p2 "")
    )

  ) ;_ end of if
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 09.05.2008, 01:21
#253
ALFMario


 
Регистрация: 11.10.2007
Gomel
Сообщений: 68


Еще вопрос есть. функция Fix возвращает целое число, но происходит у меня не всегда правильно, (fix 23.0) возвращает в какой то ситуации 23 а иногда 22, что может быть причиной ?

Последний раз редактировалось ALFMario, 13.05.2008 в 11:02.
ALFMario вне форума  
 
Непрочитано 22.05.2008, 00:15
#254
Syrex


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


неподскажите как менять цвет фона у модели? листа програмно чтобы кнопку назначить? заранее спасибо
Syrex вне форума  
 
Непрочитано 22.05.2008, 00:53
#255
Кулик Алексей aka kpblc
Moderator

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


ALFMario, твою ситуацию повторить не удалось (сколько ни пытался).
Syrex, поищи по форуму. Такая тема точно была, это я помню.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.05.2008, 01:49
#256
forMA


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


Цитата:
Сообщение от Syrex Посмотреть сообщение
неподскажите как менять цвет фона у модели? листа програмно чтобы кнопку назначить? заранее спасибо

http://www.caduser.ru/cgi-bin/f1/board.cgi?t=19162TV
forMA вне форума  
 
Непрочитано 23.05.2008, 19:25
#257
Syrex


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


forMA спасибо большое поиском пользовался но ненашел программу
Syrex вне форума  
 
Непрочитано 19.06.2008, 09:59
#258
Red Nova

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


Тему не читал. Посоветуйте пожалста книжку по изучению лисп-а, только так чтобы для полного чайника в этом деле.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 21.06.2008, 18:40
#259
Red Nova

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


Ладно, с летературой разобрался, пытаюсь написать с другом лисп, и вот возникли вопросы, может кто подскажет.
1. Как определить список выделенных обьектов?
2. Как определить тип выделенного обьекта?
3. Как получить текст из выделенного Mtext а или Text a?
4. Как получить имена Layout ов?
Заранее спасибо.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 21.06.2008, 19:24
#260
VVA

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


1.Создаем набор
(setq ss (ssget))
Преобразуем набор в список
(setq lst (_dwgru-conv-pickset-to-list ss))
Код _dwgru-conv-pickset-to-list
2. Имя примитива хнатится в поле с номером 0
Код:
[Выделить все]
(setq en (car(entsel "\Выберите объект")))
(princ "\nТип объетка: ")
(princ (cdr(assoc 0 (entget en))))
3. Опять же текстовая строка хранится с поле с номером 1, соответсвенно надо вызывать assoc с ключом 1.
4. (getvar "CTAB") - текущий
(layoutlist) - все
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 21.06.2008, 22:19
#261
Red Nova

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


Спасибо за ответ, пока еще не все понял (т.к. друга программиста рядом уже нету) но на нашем с ним следующем "занятии" обсудим, наверное опять спрашивать буду.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 23.06.2008, 00:39
#262
Кулик Алексей aka kpblc
Moderator

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


Одно уточнение: для получения строки многострочного текста только группы 1 может оказаться недостаточно - см. DXF Reference
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.12.2008, 15:27
#263
acyxou


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


Привет всем. Изучаю Lisp потихоньку, но сейчас нужно срочно проделать одну штуку на изучение которой времени нет. Вобщем я написал небольшую прогу, которая меняет папки поиска принтеров, таблиц печати и шаблонов документов.... мне нужно сделать так чтоб прога сама активировалась без ввода команды на ее запуск. Вот собственно мой деревенский код:
Код:
[Выделить все]
(defun С:Paths (/
		      server     ; Путь до сервера "////"
		      path1      ; Путь к файлам принтеров и плоттеров
		      path2      ; Путь к PMP-файлам описаний принтеров
		      path3      ; Путь к файлам таблиц печати
		      path4      ; Путь доступа к файлам шаблонов чертежей
		      )
  (setq server "\\\\")
  (setq path1 (strcat server "Server\\proekts\\AutoCAD_Resources\\Plotters"))
  (setenv "PrinterConfigDir" path1) ; Задание нашего пути доступа к принтерам 
  (setq path2 (strcat server "Server\\proekts\\AutoCAD_Resources\\Plotters\\PMP Files"))
  (setenv "PrinterDescDir" path2) ; Задание нашего пути доступа к PMP-файлам описаний принтеров
  (setq path3 (strcat server "Server\\proekts\\AutoCAD_Resources\\Plott Styles"))
  (setenv "PrinterStyleSheetDir" path3) ; Задание нашего пути доступа к файлам таблиц печати
  (setq path4 (strcat server "Server\\proekts\\AutoCAD_Resources\\Templates"))
  (setenv "TemplatePath" path4) ; Задание нашего пути доступа к к файлам шаблонов чертежей
  (alert "Пути поиска к папкам заданы")
  (princ)
  )
Вобщем этот лисп будет запускать другая программулина, т.е. мне нужно сделать так чтоб он выполнял то, что он должен выполнять сразу же после выполнения команды Appload, т.е. не ждать пока пользователь введет Paths. Вопрос простой, но как это правильно сделать я еще не изучил.... Посоветуйте плиз!
acyxou вне форума  
 
Непрочитано 18.12.2008, 16:42
#264
Кулик Алексей aka kpblc
Moderator

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


В _appload забиваешь файл lsp с примерно таким содержанием:
Код:
[Выделить все]
(defun paths ()
  (setenv "PrinterConfigDir" "\\\\Server\\proekts\\AutoCAD_Resources\\Plotters")
  (setenv "PrinterDescDir" "\\\\Server\\proekts\\AutoCAD_Resources\\Plotters\\PMP Files")
  (setenv "PrinterStyleSheetDir" "\\\\Server\\proekts\\AutoCAD_Resources\\Plott Styles")
  (setenv "TemplatePath" "\\\\Server\\proekts\\AutoCAD_Resources\\Templates")
  ) ;_ end of defun

(defun c:paths ()
  (paths)
  (princ)
  ) ;_ end of defun

(paths)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.12.2008, 16:59
#265
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Раз тему подняли, напишу сюда.
Программно создаю Мтекст. Присваиваю переменной prim vla-указатель на этот Мтекст.
Далее заполняю свойства:
Код:
[Выделить все]
(vla-put-AttachmentPoint prim 7)	;выравнивание
(vla-put-BackgroundFill prim :vlax-false) ;фон
(vla-put-DrawingDirection prim 5)	;направление текста
(vla-put-Height prim 2.5)		;высота
(vla-put-Layer prim "M-08-текст")	;слой
(vla-put-LineSpacingStyle prim 1)	;стиль межстрочного интервала
(vla-put-Linetype prim "ByLayer")	;тип линии
(vla-put-LinetypeScale prim 1.0)	;масштаб типа линии
(vla-put-StyleName prim "M-Standard_0") ;текстовый стиль
Так вот вопрос: как это можно сделать более красиво?
Makswell вне форума  
 
Непрочитано 18.12.2008, 17:16
#266
Дима_

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


Создавая через dxf эту безобразие можно задать все сразу.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 18.12.2008, 18:00
#267
acyxou


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


Кулик Алексей aka kpblc спасибо огромное! То что нужно!
acyxou вне форума  
 
Непрочитано 18.12.2008, 19:22
#268
kuzmich1


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


Всем привет. У меня такой простенький вопрос. Нужно чтоб моя прога создавала размерный стиль с определенными параметрами. У меня есть файл с этим стилем, я набираю в командной строке (tblsearch "dimstyle" "имя") и он мне выдает список кодов. Дальше я его копирую и вставляю в entmake. В итоге получается следующее:
Цитата:
; создание размерного стиля "имя"
(defun c:nnn()
(entmake '((0 . "DIMSTYLE") (2 . "имя") (70 . 0) (3 . "") (4 . "") (5 . "") (6 . "") (7 . "") (40 . 10.0) (41 . 4.0) (42 . 0.5) (43 . 10.0) (44 . 0.5) (45 . 0.0) (46 . 0.0) (47 . 0.0) (48 . 0.0) (140 . 7.0) (141 . -4.0) (142 . 0.0) (143 . 0.0394) (144 . 1.0) (145 . 0.0) (146 . 1.0) (147 . 0.5) (71 . 0) (72 . 0) (73 . 0) (74 . 0) (75 . 0) (76 . 0) (77 . 1) (78 . 8) (170 . 0) (171 . 2) (172 . 1) (173 . 0) (174 . 0) (175 . 0) (176 . 256) (177 . 256) (178 . 7) (270 . 2) (271 . 0) (272 . 0) (273 . 2) (274 . 2) (340 . <Entity name: 7ef5edc0>) (275 . 0) (280 . 0) (281 . 0) (282 . 0) (283 . 1) (284 . 0) (285 . 0) (286 . 0) (287 . 3) (288 . 0)))
)
Запускаю и он выдает: error: extra cdrs in dotted pair on input.
Подскажите что делаю не так и как правильно, буду очень благодарен. Уже замучился
kuzmich1 вне форума  
 
Непрочитано 18.12.2008, 20:40
#269
Кулик Алексей aka kpblc
Moderator

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


340-ю группу надо менять. На форуме была тема по программному созданию размерных стилей - поищи.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.12.2008, 08:24
#270
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


И не только 340-ю...
В список надо, как минимум, ещё добавить:
Код:
[Выделить все]
(cons 100 "AcDbSymbolTableRecord")
(cons 100 "AcDbDimStyleTableRecord")
Добавлено:
kuzmich1, также посмотри, что возвращает:
Код:
[Выделить все]
(if (tblsearch "dimstyle" "имя")
  (entget (tblobjname "dimstyle" "имя"))
)
Makswell вне форума  
 
Непрочитано 19.12.2008, 08:36
#271
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


По поводу вопроса из поста #265.
Сказав "красиво", я имел ввиду следущее. Допустим, есть список из точечных пар (СВОЙСТВО . ЗНАЧЕНИЕ_СВОЙСТВА)
Код:
[Выделить все]
(list (cons 'AttachmentPoint 7)
      (cons 'BackgroundFill :vlax-false)
      (cons 'DrawingDirection 5)
      (cons 'Height 2.5)
      (cons 'Layer "M-08-текст")
      (cons 'LineSpacingStyle 1)
      (cons 'Linetype "ByLayer")
      (cons 'LinetypeScale 1.0)
      (cons 'StyleName "M-Standard_0")
)
В общем-то вопрос простой - именно азы лиспа. Как будет выглядеть конструкция с применением этого списка, а также функции vlax-put-property, которая меняла бы свойства МТекста?
Makswell вне форума  
 
Непрочитано 19.12.2008, 11:02
#272
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от Makswell Посмотреть сообщение
Как будет выглядеть конструкция с применением этого списка, а также функции vlax-put-property, которая меняла бы свойства МТекста?
Как-то так:
Код:
[Выделить все]
(defun demo (/ doc prim sps)
 (setq doc  (vla-get-activedocument (vlax-get-acad-object))
       sps  (vla-get-modelspace doc)
       prim (vla-addmtext sps (vlax-3d-point 0.0 0.0) 100 "Демо текст")
 )
 (foreach a (list (list 'AttachmentPoint 7)
                  (list 'BackgroundFill :vlax-false)
                  (list 'DrawingDirection 5)
                  (list 'Height 2.5)
                  (list 'Layer "M-08-текст")
                  (list 'LineSpacingStyle 1)
                  (list 'Linetype "ByLayer")
                  (list 'LinetypeScale 1.0)
                  (list 'StyleName "M-Standard_0")
            )
  (apply (function vlax-put-property) (cons prim a))
 )
 (princ)
)
Демка без проверок.
Alaspher вне форума  
 
Непрочитано 19.12.2008, 11:10
#273
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Alaspher, спасибо. То что нужно.
Makswell вне форума  
 
Непрочитано 19.12.2008, 11:38
#274
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Если
Цитата:
есть список из точечных пар (СВОЙСТВО . ЗНАЧЕНИЕ_СВОЙСТВА)
то можно так
Код:
[Выделить все]
(mapcar
  '(lambda (x y)
     (vlax-put-property vla_obj x y)
   ) ;_ end of lambda
  (mapcar 'car lst)
  (mapcar 'cdr lst)
) ;_ end of mapcar
где lst список из #271
vla_obj - vla-объект
CB вне форума  
 
Непрочитано 19.12.2008, 11:52
#275
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


CB, да это тоже неплохо. Это я и имел ввиду, сказав "красиво"
Makswell вне форума  
 
Непрочитано 02.02.2009, 12:21 Помогите Ламеру(((((
#276
merlin777


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


Товарищи!!!
Начал пробывать тяжкие попытки работать с Lisp
и столкнулся с незнанием азов програмирования)
Ввожу команды четко по учебнику точно по учебнику
с содержанием
(comand "_.LINE" "0.0" "210.0")
(comand "210,297" "0,297")
(comand "_C")
после чего получаю ответ типа

; îøèáêà: no function definition: COMAND

Подскажите с чем это может быть связано
либо приведите пример правильного блока команд
Заранее спасибо
merlin777 вне форума  
 
Непрочитано 02.02.2009, 12:24
#277
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Точно по учебнику?
Нет функции comand, есть command
Makswell вне форума  
 
Непрочитано 02.02.2009, 12:27
#278
merlin777


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


Спасибо
А можете привести пример стандартной команды для изображения круга или прямоугольника
merlin777 вне форума  
 
Непрочитано 13.02.2009, 11:30 Написание программы Магический квадрат
#279
gve2005


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


Хочу в программе AutoLISP написать программку Магический квадрат.
Это программка каким-то образом угадывает английские буквы на основе чисел. Вот ссылка: http://www.ugbereg.ru/magic.html

Вопрос: Может у кого есть идеи по переносу данной программки на этот язык програмирования
gve2005 вне форума  
 
Непрочитано 13.02.2009, 11:44
#280
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от gve2005 Посмотреть сообщение
Хочу в программе AutoLISP написать программку Магический квадрат.
Это программка каким-то образом угадывает английские буквы на основе чисел. Вот ссылка: http://www.ugbereg.ru/magic.html

Вопрос: Может у кого есть идеи по переносу данной программки на этот язык програмирования
Это "программка" показывает символ, который одинаков у всех возможных результатов, т.е. 9, 18, 27, 36, 45, 54, 63, 72, 81. Поскольку так же забит и 0, то "алгоритм" работает и с однозначными числами.

ЗЫЖ На сайте, куда ведёт ссылка пытаются отрабатывать какие-то скрипты (у меня зарезаны по дефолту), те, кто решит заглянуть, проявите осторожность - неисключены неприятности.

Последний раз редактировалось Alaspher, 13.02.2009 в 11:46. Причина: добавление примечания
Alaspher вне форума  
 
Непрочитано 13.02.2009, 11:44
#281
Zouss


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


Offtop: как бы его удалить совсем?
Zouss вне форума  
 
Непрочитано 13.02.2009, 12:16
#282
Кулик Алексей aka kpblc
Moderator

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


Zouss, это ты про кого?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.02.2009, 12:32
#283
bridgeconst

проектирование
 
Регистрация: 29.11.2007
Москва
Сообщений: 311


Какое-то кидалово с этим квадратом. Расчитан на блондинок:
3. Найдите это число в таблице и символ, которому оно соответствует.
И все люди интуитивно указателем мышки пробегают мимо загаданного символа. Тут не трудно угадать.
Вот вы попробуйте просто загадать число и указателем вообще в поле знаков не шевелить - хрен чего этот квадрат угадает.
__________________
Обмениваю незнание на время.
bridgeconst вне форума  
 
Непрочитано 13.02.2009, 12:40
#284
Дима_

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


Цитата:
Сообщение от bridgeconst Посмотреть сообщение
Какое-то кидалово с этим квадратом. Расчитан на блондинок:
3. Найдите это число в таблице и символ, которому оно соответствует.
И все люди интуитивно указателем мышки пробегают мимо загаданного символа. Тут не трудно угадать.
Вот вы попробуйте просто загадать число и указателем вообще в поле знаков не шевелить - хрен чего этот квадрат угадает.
Принцип "угадывания" основом на элементарной математике, никакого отслеживания мышки там нет.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 13.02.2009, 12:56
#285
bridgeconst

проектирование
 
Регистрация: 29.11.2007
Москва
Сообщений: 311


Похоже так. Чего я погорячился.
там определенная система.
__________________
Обмениваю незнание на время.

Последний раз редактировалось bridgeconst, 13.02.2009 в 13:04.
bridgeconst вне форума  
 
Непрочитано 20.02.2009, 09:40
#286
stas_org


 
Регистрация: 05.04.2007
Самара
Сообщений: 1,202


Код:
[Выделить все]
;Хитрая функция - преобразует строку в список, потом вставляет в сисок десятичную точку и
;возвращает опять строку
(defun elevation:koordinate (string / abs:str1)
  (setq str (vl-string->list string))
  (setq	y1 (nth 0 str)
	y2 (nth 1 str)
	y3 (nth 2 str)
	y4 (nth 3 str)
	y5 (nth 4 str)
	y6 (nth 5 str)
	y. 46
	y0 48
  )

  (if (= str1 0)			;проверка - нулевая отметка или нет
    (vl-list->string (list y0 y. y0 y0 y0))
    (if	(> str1 0)			;проверка - положительнa или отрицательнa отметкa
      (progn
	(if (< str1 10)
	  (vl-list->string (list y0 y. y0 y0 y1))
	  (if (< str1 100)
	    (vl-list->string (list y0 y. y0 y1 y2))
	    (if	(< str1 1000)
	      (vl-list->string (list y0 y. y1 y2 y3))
	      (if (< str1 10000)
		(vl-list->string (list y1 y. y2 y3 y4))
		(vl-list->string (list y1 y2 y. y3 y4 y5))
		)
	    )				;if 10
	  )				;if 1
	)				;if 0.1
      )					;progn
      (progn
	(setq abs:str1 (abs str1))
	(if (< abs:str1 10)
	  (vl-list->string (list y1 y0 y. y0 y0 y2))
	  (if (< abs:str1 100)
	    (vl-list->string (list y1 y0 y. y0 y2 y3))
	    (if	(< abs:str1 1000)
	      (vl-list->string (list y1 y0 y. y2 y3 y4))
	      (if (< abs:str1 10000)
		(vl-list->string (list y1 y2 y. y3 y4 y5))
		(vl-list->string (list y1 y2 y3 y. y4 y5 y6))
		)
	    )				;if 10
	  )				;if 1
	)				;if 0.1
      )					;progn
    )					;if +/-
  )					;if 0

)					;defun
      

(defun c:elevation (/	   plw	  str1	 str2	str3   pt1    pt2
		    pt3	   pt4	  pt5	 pt7	pt8    osm    dimscl
		    pt0	   pta	  ortho	 cmd1	blm    ang1   ang2
		    ptt	   let	  autosn tx	SF
		   )			;задание функции и определение переменных
  (initget 3)				;запрет пустого ввода
  (setq osm (getvar "OSMODE"))
  (setq autosn (getvar "autosnap"))
  (setq dimscl (getvar "dimscale"))
  (setq ortho (getvar "ORTHOMODE"))
  (setq	cmd1 (getvar "CMDECHO"))
  (setq plw (getvar "plinewid"))
  
  
  (setq pt1 (getpoint "\nТочка вставки отметки : "))
					;получение точки вставки

;;;  (setq str1 (/ (nth 1 pt1) 1000))	;получение из списка pt1 координаты у деленой на 1000
  (setq str1 (nth 1 pt1))
  (setq str2 (elevation:koordinate (rtos str1 2 3)))		;преобразование str1 в строковую константу децеметрическую (2) и с округлением до 3 цифр после запятой
  (setq str3 (strcat "+" str2))                ;слияние + и содержимого переменной                                        

  
  
  (setvar "cmdecho" 0)
  (setvar "OSMODE" 0)
  (setvar "ORTHOMODE" 1)
  
  (setq pt0 (getpoint pt1 "\nТочка направления по вертикали : "))
  (setq ang1 (angle pt1 pt0))
  (if (<= ang1 pi)
    (setq ang1 (/ pi 2))
    (setq ang1 (/ (* pi 3) 2))
  )
  (setq	pt0 (polar pt1 ang1 (* dimscl 10))
  )
  (command "line" pt1 pt0 "")
  (setq pta (getpoint pt0 "\nТочка направления по горизонтали : "))
  (setq ang2 (angle pt0 pta))
  (if (<= ang2 (/ pi 2))
    (setq ang2 0)
    (setq ang2 pi)
  )
  (command "erase" "last" "")
  (setvar "ORTHOMODE" ortho)
  (setq	pt2 (polar pt1 ang2 (* dimscl 10))
	pt3 (polar pt1 ang2 (* dimscl 5))
	pt4 (polar pt3 ang1 (* dimscl 6))
	pt5 (polar pt4 ang2 (* dimscl 15))
	ptt (polar pt4 ang2 (* dimscl 10))
  )
  (setq ss (ssadd))
  (command "pline"
	   pt1
	   "w"
	   (* dimscl 0.3)
	   (* dimscl 0.3)
	   pt2
	   ""
  )
  (setq s1 (entlast))
  (ssadd s1 ss)
  (command "line" pt3 pt4 "")
  (setq s2 (entlast))
  (ssadd s2 ss)
  (command "line" pt4 pt5 "")
  (setq s3 (entlast))
  (ssadd s3 ss)
  (if (= ang1 (/ pi 2))
    (setq pt7 (polar pt3 (/ pi 4) (* dimscl 4))
	  pt8 (polar pt3 (/ (* pi 3) 4) (* dimscl 4))
    )
    (setq pt7 (polar pt3 (/ (* pi 5) 4) (* dimscl 4))
	  pt8 (polar pt3 (/ (* pi 7) 4) (* dimscl 4))
    )
  )
  (setq ang1 (/ pi 2))
  (command "pline" pt3 pt7 "")
  (setq s4 (entlast))
  (ssadd s4 ss)
  (command "pline" pt3 pt8 "")
  (setq s5 (entlast))
  (ssadd s5 ss)
;;;---------------------текст-------------------------------------------------

  (if (> str1 0)
        (setq tx str3)
        (setq tx str2)
      )
  
  (setq otmetka (strcat "\nОтметка:<" tx "> "))
  (setq let (getstring otmetka))
  (if (= (strcase let) "")
    (command "text" "J" "bc" ptt (* dimscl  2.5) 0 tx)
    (command "text" "J" "bc" ptt (* dimscl  2.5) 0 let)
  )
  (setq s6 (entlast))
  (ssadd s6 ss)
  (command "_.-group" "create" "*" "ELEVATION" ss "")
					;------ заключительные операции (восстановление системных переменных ---------
  (setvar "CMDECHO" cmd1)
  (setvar "OSMODE" osm)
  (setvar "autosnap" autosn)
  (setvar "plinewid" plw)
  (princ)
)					;конец функции
;;------------> the end <--------------

Помогите пожалуйста сделать так, чтобы полученная отметка умножалась на значение переменной DIMLFAC.
stas_org вне форума  
 
Непрочитано 20.02.2009, 13:41
#287
Main Urod


 
Регистрация: 20.01.2009
Сообщений: 1,170


Есть вопрос по VLA объектам.

Пишу програмку, которая перебирает все примитивы чертежа отбирая нужные для работы. при нахождении нового нужного объекта я сохраняю его параметры (имя и идентификатор) в точечной паре. Пару добавляю в список для последующей работы только с нужными объектами:

Код:
[Выделить все]
 (setq s (entnext))
  (while (/= s nil)	
    (setq object_vla (vlax-ename->vla-object s))
    (setq object_vla_name (vla-get-ObjectName object_vla))
    (setq spis (append spis (list (cons object_vla_name object_vla))))
    (setq s (entnext s))
 )
Список нормальнео сохраняется в виде:

Код:
[Выделить все]
(AcDbLine . #<VLA-OBJECT IAcadLine 01f9a88c>)
(AcDbMText . #<VLA-OBJECT IAcadMText 10078154>) (AcDbBlockReference . #<VLA-OBJECT IAcadBlockReference 10253454>)
Однако при последующей попытке получить доступ к VLA объекту с помощью:

Код:
[Выделить все]
(princ "имя объекта: ")
(princ (nth 0 (nth 0 spis)))
(terpri)
(princ "адрес объекта: ")
(princ (nth 1 (nth 0 spis)))
(terpri)
получаю имя объекта (первый элемент точечной пары) и ошибку вместо идентификатора.

Я чтот о делаю не так, или после создания второго VLA объекта первый перестает существовать и его адрес становится недействительным?

Собственно проблему я уже решил, сохраняя не идентификатор VLA объекта а идентификатор примитива, но любопытство осталось...
Main Urod вне форума  
 
Непрочитано 20.02.2009, 13:50
#288
Кулик Алексей aka kpblc
Moderator

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


nth работает только со списками, а для точечных пар используй car и cdr
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.02.2009, 14:09
#289
Main Urod


 
Регистрация: 20.01.2009
Сообщений: 1,170


Спасибо. Заработало.
Только непонятно, почему можно получить через nth первый элемент точечной пары...
Main Urod вне форума  
 
Непрочитано 20.02.2009, 14:20
#290
Кулик Алексей aka kpblc
Moderator

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


А ты проверни в vlide:
Код:
[Выделить все]
(listp '(1 2))
(listp '(3 . 4))
---
Добавлено:
Туда же...
Код:
[Выделить все]
(type '(1 2))
(type '(1 . 2))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.02.2009, 19:20
#291
Дима_

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


Я бы посоветовал для более "лисповской" реалзаци данного алгоритма изучить функции ssget, mapcar, lambda. Думаю еще не раз пригодяться.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 24.02.2009, 08:49
#292
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А ты проверни в vlide:
Код:
[Выделить все]
(listp '(1 2))
(listp '(3 . 4))
---
Добавлено:
Туда же...
Код:
[Выделить все]
(type '(1 2))
(type '(1 . 2))
Вот, провернул...
Цитата:
_$ (listp '(1 2))
T
_$ (listp '(3 . 4))
T
_$ (type '(1 2))
LIST
_$ (type '(1 . 2))
LIST
Вообще-то разницы никакой.
Makswell вне форума  
 
Непрочитано 24.02.2009, 10:43
#293
VVA

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


Makswell, Наверное имелось ввиду
Код:
[Выделить все]
(listp (cdr '(1 2)))
(listp (cdr '(3 . 4)))
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 24.02.2009, 11:18
#294
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Ага, понятно. Кстати, не раз сам на этом обжигался.
Makswell вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Я начинаю заниматься программированием LISP (help)