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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > как получить LISP код фрагмента?

как получить LISP код фрагмента?

Ответ
Поиск в этой теме
Непрочитано 10.10.2007, 09:38 #1
как получить LISP код фрагмента?
DY
 
Москва
Регистрация: 21.12.2006
Сообщений: 110

Программирую сугубо для себя - для души, LISP только начал просматривать в виду того, что возникла необходимость в одной простецкой програмке под ACAD.

Появился вопрос - собственно сабж.
Возможно ли нарисовать примитивный рисунок и получить LISP-код этого рисунка, или выделенного его фрагмента. Кроме как ковырятся в dxf? что-то типа _copy с результатом команды - текст данного фрагмента.

С уважением.
Просмотров: 4359
 
Непрочитано 10.10.2007, 09:55
#2
Profan


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


Это для того, чтобы потом не копировать и вставлять рисунок или фрагмент через буфер обмена или с помощью команды "_INSERT" ("ВСТАВИТЬ"), а запускать LISP-файл на выполнение (построение) этого рисунка или фрагмента?
Profan вне форума  
 
Автор темы   Непрочитано 10.10.2007, 10:07
#3
DY


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


--------------------
Это для того, чтобы потом не копировать и вставлять рисунок или фрагмент через буфер обмена или с помощью команды "_INSERT" ("ВСТАВИТЬ"), а запускать LISP-файл на выполнение (построение) этого рисунка или фрагмента?
--------------------

Почти так, а именно получить LISP-файл (текст) построения и использовать в своей прогремме.
Я так понимаю это возможно - если возможно запускать, то следовательно имеешь текст того что запускаешь. Просто copy - самое первое что бросилось в глаза.

Это нужно для быстрого (автоматического) создания и дополнения/корректирования базы данных - схематического обозначения оборудования.

С уважением.
DY вне форума  
 
Автор темы   Непрочитано 10.10.2007, 10:09
#4
DY


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


Возможно изобретаю велосипед и что то похожее уже есть. Но не нашел ни чего подходящего - проще создать именно под себя.
DY вне форума  
 
Непрочитано 10.10.2007, 10:14
#5
Profan


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


А скрипт расписать?
Похожие темы были. Записать лог выполняемых команд при вычерчивании.
Profan вне форума  
 
Автор темы   Непрочитано 10.10.2007, 10:15
#6
DY


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


Цитата:
Сообщение от Profan
А скрипт расписать?
Так точно!

С уважением.
DY вне форума  
 
Автор темы   Непрочитано 10.10.2007, 11:30
#7
DY


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


Цитата:
Сообщение от Profan
А скрипт расписать?
Похожие темы были. Записать лог выполняемых команд при вычерчивании.
темы были, но на autocad.ru и к задаче подходиле более глобально - из файла DXF получить скрипт на построение аналогичного рисунка.

Чертить занаво, то, что уже есть - это проще самому написать код для каждого объекта или найти в dxf. Но это займет много времени.
По этому наиболее актуальна идея не чертить и потом смотреть лог, а именно выделил и получил (на блюдечке с голубой каемочкой). Интерестно, что берет команда _copy? И что отдает _paste?
С виду задача до ужаса простая, но как решить...
DY вне форума  
 
Непрочитано 10.10.2007, 11:58
#8
Profan


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


Что-то я сомневаюсь в актуальности такого Лиспа.
Profan вне форума  
 
Непрочитано 10.10.2007, 12:12
#9
Кулик Алексей aka kpblc
Moderator

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


Лично я сомневаюсь в простоте этого лиспа. Надо следом за примитивами тащить все записи о слоях, типах линий, стилях печати, дополнительных неграфических данных (РД, словари - в первую очередь касается дин.блоков) и тому подобное. И полностью согласен с Profan - насколько нужен этот лисп? Возможно, все решается [почти] штатными методами. В том числе и через _wblock.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.10.2007, 12:24
#10
Александр Ривилис

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


Баловство все это. Размер такой lisp-программы может быть на порядок больше чем размер dwg-файла.
Александр Ривилис вне форума  
 
Непрочитано 10.10.2007, 12:43
#11
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,826


Для простых случаев (без блоков всяких) можно сохранять dxf код каждого элемента через entget, и выкинуть лишнее
Код:
[Выделить все]
(foreach p '(-1 330 5) (setq pr (vl-remove (assoc p pr) pr)))
, ну и для отрисовки
Код:
.
Krieger вне форума  
 
Непрочитано 10.10.2007, 12:45 Re: как получить LISP код фрагмента?
#12
ShaggyDoc

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


Цитата:
Сообщение от DY
... необходимость в одной простецкой програмке под ACAD.
Это совсем не "простецкая програмка". Это наподобие "нажал кнопку и получил проект здания"

Цитата:
нарисовать примитивный рисунок и получить LISP-код этого рисунка, или выделенного его фрагмента
Это ненужная программа, так как программа предполагает какую-то параметризацию - выполнение даже "примитивного" рисунка во множестве вариантов. Например, прямоугольника с разными размерами сторон. А для повторения "такого же" рисунка или его фрагмента в AutoCAD предусмотрено копирование и блоки.

Идеи "нарисовать образец" и получить LISP-код постоянно возникают у начинающих программировать в AutoCAD. Давным-давно, для реализации такой идеи в России была разработана специальная программа GLISP. Очень непростая и мастерски сделанная. Только она делала ненужное и потому благополучно умерла.

Там было реализовано автоматическое создание LISP-кода для параметрического рисования однотипных рисунков. Например, болта разных диаметров и длины. Пользователь должен был нарисовать болт в AutoCAD, особым образом проставить размеры (выделяя, какие из них могут быть переменными) и GLISP мог сгенерировать программу. Параметры могли вводиться в диалоге, храниться в специальной базе данных ABASE.

Однако не прижилась эта программа, по идее предназначенная для инженеров, не умеющих программировать. Инженерам как раз оказалось проще освоить LISP, чем сложные манипуляции с подготовкой "простеньких рисунков". Программировать рисование болтов научились тысячи инженеров. А после простых болтов стали программировать и сложные вещи.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 10.10.2007, 13:21
#13
DY


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


Цитата:
Сообщение от ShaggyDoc
Цитата:
Сообщение от DY
... необходимость в одной

простецкой програмке под ACAD.
Это совсем не "простецкая програмка". Это наподобие "нажал

кнопку и получил проект здания"

Цитата:
нарисовать примитивный рисунок и получить LISP-код

этого рисунка, или выделенного его фрагмента
Это ненужная программа, так как программа

предполагает какую-то параметризацию - выполнение даже

"примитивного" рисунка во множестве вариантов.
Мне не нужен проект здания по одной кнопке (я не

лентяй-идеалист), не нужно множество вариантов этого

"примитивного" рисунка.
Все что необходимо это имеющийся фрагмент рисунка показать

в dxf коде - только геометрию можно без лишних сведений

(как в бейсике Line , LineTo, Circle и т.д.) без типов

линий слоев и цвете - или это по умолчанию.

Фрагмент рисунка из чего получать прилагаю.
А получить надо коды (к примеру) объектов 269, 270, 271 ...

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

новые которые потом часто использую.
[ATTACH]1192008067.dwg[/ATTACH]
DY вне форума  
 
Автор темы   Непрочитано 10.10.2007, 14:11
#14
DY


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


Я так понимаю все кто высказался по данному вопросу пришли к двум мнениям:

1 - это не нужно
2 - это сложно

А жаль.
Если это не возможно. Значит не возможно, но на мой взгляд - это действительно простая задача, просто не надо ее усложнять.
Здесь многие люди реально создают куда более сложные вещи.
DY вне форума  
 
Непрочитано 10.10.2007, 14:17
#15
Alaspher


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


Цитата:
Сообщение от DY
Фрагмент рисунка из чего получать прилагаю.
А получить надо коды (к примеру) объектов 269, 270, 271 ...

и т.д. Таких объектов у меня тьма и каждый раз появляются новые которые потом часто использую.
По виду, как раз классические элементы для библиотеки блоков. Честно говоря, не понял, что с ними делать лиспом?

То, что заявлено, как тема топика, в нынешних автокадах - невозможно (то, что можно уже написали). GLISP - действительно была интересной, но как вещь в себе, а не как инструмент.
Alaspher вне форума  
 
Непрочитано 10.10.2007, 14:32
#16
ShaggyDoc

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


В исходном вопросе было получить LISP-код этого рисунка

Получить DXF-коды можно функцией (entget (car ent)) где ent - список, возвращаемый функцией entsel. Для "рисунка", то есть "кучи" примитивов - примерно как показал Krieger [11].

А вот оформлять "как в бейсике" вряд ли кто возьмется. Правильно Александр Ривилис написал - "Баловство все это".

Вывести в более читабельном виде - можно.
[ATTACH]1192012321.gif[/ATTACH]
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 10.10.2007, 14:53
#17
DY


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


То что мне необходимо - это не возможно?

Значит пациент скорее мертв, чем жив...
DY вне форума  
 
Автор темы   Непрочитано 11.10.2007, 09:26
#18
DY


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


Извиняюсь, за настойчивость.

А если немного видоизменить задачу (пост №11):

Возможно ли, Выделив несколько примитивов, провести их перебор, получив при этом имя/тип примитивов (линия, полилиния, окружность и т.д.) и координаты их характерных точек. Полученную информацию сохраненить в текстовый файл. Хотя бы с помощью _entget.

Может если не LISPом, то средствами VBA это возможно?Ну, или что-то похожее...
DY вне форума  
 
Непрочитано 11.10.2007, 09:36
#19
Кулик Алексей aka kpblc
Moderator

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


Посты 11 и 16, оформленные в функцию с записью в указанный файл. Не больше.
Код:
[Выделить все]
(defun stu (/ selset res file_name file_handle)
  (if (and (setq selset (ssget))
           (setq file_name (cond
                             ((getfiled "Export file"
                                        (vl-filename-base (getvar "dwgname"))
                                        "txt"
                                        1
                                        ) ;_ end of getfiled
                              )
                             (t (vl-filename-base (getvar "dwgname")))
                             ) ;_ end of cond
                 ) ;_ end of setq
           ) ;_ end of and
    (progn
      (foreach ent (vl-remove-if 'listp (mapcar 'cadr (ssnamex selset)))
        (setq res (cons (vl-princ-to-string
                          (mapcar '(lambda (x)
                                     (cons (car x)
                                           (if (= (type (cdr x)) 'str)
                                             (strcat "\"" (cdr x) "\"")
                                             (cdr x)
                                             ) ;_ end of if
                                           ) ;_ end of cons
                                     ) ;_ end of lambda
                                  (vl-remove-if
                                    '(lambda (x) (member (car x) '(-1 5 330)))
                                    (entget ent)
                                    ) ;_ end of vl-remove-if
                                  ) ;_ end of mapcar
                          ) ;_ end of vl-princ-to-string
                        res
                        ) ;_ end of cons
              ) ;_ end of setq
        ) ;_ end of foreach
      (setq file_handle (open file_name "w"))
      (foreach item res
        (write-line item file_handle)
        ) ;_ end of foreach
      (close file_handle)
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
+ DWF Reference...
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 11.10.2007, 09:59
#20
DY


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


Цитата:
Сообщение от Кулик Алексей aka kpblc
Код:
+ DWF Reference...
Монстр!!!! Respect!!! [sm157]

Как раз, то, что надо!!!!

Видимо я вчера не правильно сформулировал что необходимо.
DY вне форума  
 
Автор темы   Непрочитано 11.10.2007, 10:13
#21
DY


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


Цитата:
Сообщение от Кулик Алексей aka kpblc
Посты 11 и 16, оформленные в функцию с записью в указанный файл. Не больше.
Согласен!

Но ты первый, кто упаковал в коробочку и привязал бантик!

Естественно спасибо:
ShaggyDoc
Krieger
DY вне форума  
 
Непрочитано 11.10.2007, 11:24
#22
Кулик Алексей aka kpblc
Moderator

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


Опечатался я там слегка: DXF Reference, а не та матерщина, что показана в #19...
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.10.2007, 11:55
#23
Profan


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


"Фе" не модератору, а участнику форума Алексею Кулику за матерщину.
Profan вне форума  
 
Непрочитано 11.10.2007, 12:10
#24
Кулик Алексей aka kpblc
Moderator

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


Вай-вай-вай, мама, попка, больно!
Сижу и посыпаю голову пеплом
__________________

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

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,826


DY
Еще это глянь:
http://dwg.ru/forum/viewtopic.php?t=12464
Krieger вне форума  
 
Автор темы   Непрочитано 11.10.2007, 12:50
#26
DY


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


Спасибо! Как раз к этому подошел.
DY вне форума  
 
Автор темы   Непрочитано 11.10.2007, 13:11
#27
DY


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


Медленно схожу с ума. [sm1013]

Код:
[Выделить все]
(defun C:Lin()
(command "_block" "1" '(0 0)
	 (entmake 
  		'((0 . "CIRCLE")
   		  (100 . "AcDbEntity")
   		  (67 . 0)
   		  (410 . "Model")
   		  (8 . "0")
   		  (62 . 2)
   		  (100 . "AcDbCircle")
   		  (10 118226.0 48200.1 0.0)
   		  (40 . 771.394)
   		  (210 0.0 0.0 1.0)
  		)
)	)
)
Должно создать Блок с именем 1 с точкой вставки 0,0 внутри блока круг.

Круг есть, блока нет.

P.S. Не стреляйте в пианиста он играет как умеет.
DY вне форума  
 
Непрочитано 11.10.2007, 13:15
#28
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
(defun C:Lin()
(command "_block" "1" '(0 0)
    (entmakex
        '((0 . "CIRCLE")
           (100 . "AcDbEntity")
           (67 . 0)
           (410 . "Model")
           (8 . "0")
           (62 . 2)
           (100 . "AcDbCircle")
           (10 118226.0 48200.1 0.0)
           (40 . 771.394)
           (210 0.0 0.0 1.0)
        )
)   )
)
Но сработает или нет - не знаю, не проверял
__________________

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


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


Блок есть - круга нет.

:shock:

Точнее, строит круг и просит выделить объеты, если круг не выделять то строит пустой блок.
DY вне форума  
 
Непрочитано 11.10.2007, 13:24
#30
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
defun C:Lin()
(command "_block" "1" '(0 0)
    (entmakex
        '((0 . "CIRCLE")
           (100 . "AcDbEntity")
           (67 . 0)
           (410 . "Model")
           (8 . "0")
           (62 . 2)
           (100 . "AcDbCircle")
           (10 118226.0 48200.1 0.0)
           (40 . 771.394)
           (210 0.0 0.0 1.0)
        )
) ))
(while (/= (getvar "cmdactive") 0)
(command "")
)
Попробуй...
Хотя я бы делал по-другому.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.02.2020, 07:00
#31
SRAIBIKUS

ПРОГРАММИСТ
 
Регистрация: 11.10.2019
СПБ
Сообщений: 4


КАК ВЫТАЩИТЬ С ПОМ. (ENTGET) ДАННЫЕ О ДУГОВОМ УЧАСТКЕ ПОЛИЛИНИИ ?

----- добавлено через ~13 мин. -----
И где можно найти все DXF-коды для полилинии?
SRAIBIKUS вне форума  
 
Непрочитано 17.02.2020, 07:45
#32
Кулик Алексей aka kpblc
Moderator

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


"И нечего так орать" (с)
https://autolisp.ru/2019/05/07/dxf-reference/
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.02.2020, 07:58
#33
SRAIBIKUS

ПРОГРАММИСТ
 
Регистрация: 11.10.2019
СПБ
Сообщений: 4


Спасибо большое, простите за безграмотность (хотя, говорят, не бывает глупых вопросов, бывают глупые ответы...) Спасибо в любом случае...
SRAIBIKUS вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > как получить LISP код фрагмента?

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

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