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

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

LISP. Как в ActiveX выдернуть координаты полилинии? Как задавать атребуты блока через LISP?

Ответ
Поиск в этой теме
Непрочитано 30.06.2016, 15:46 #1
LISP. Как в ActiveX выдернуть координаты полилинии? Как задавать атребуты блока через LISP?
wpww
 
Регистрация: 16.03.2015
Сообщений: 13

Добрый день. Написал ЛИСП. Суть в следующем:
1) выбираем полилинию
2) поверх полилинии создается временная полилиния, далее она размечается блоком с интервалом 60
3) на начальнйо точке полилинии ставится блок
4) удаляется временная полилиния
5) так происходит со всеми участками полилинии.
Ниже приведен текст лиспа:
Код:
[Выделить все]
 (defun c:plz ( / )
  (setq oldpline (car (entsel))) 
  (setq pline (entget oldpline))
  (setq pline (member (assoc 10 pline) pline))
  (setq x1 (car pline)) 
  (setq pline (cdr pline))
  (while (assoc 10 pline) 
    (setq pline (member (assoc 10 pline) pline))
    (setq x2 (car pline)) 
    (setq ygol (* (angle (cdr x1) (cdr x2)) (/ 180 pi)))
    (entmake (list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (cons 100 "AcDbPolyline") (cons 90 2) x1 x2))
    (setq xyz (entlast))
    (command "_-insert" "bk" (cdr x1) "" "1" ygol) 
    (command "_.measure" xyz "á" "BK" "ä" "60")
    (entdel xyz) 
    (setq x1 x2) 
    (setq pline (cdr pline)) 
  )
)
Помогите разобраться в следующих моментах:
1) как это реализовать с применением ActiveX. у меня получилось выдернуть координаты вершин полилинии,
Цитата:
(setq pline (vla-get-coordinates (vlax-ename->vla-object (car (entsel)))))
но они записывались ввиде варианта, а как с ним работать дальше я не понял.

2) как вставлять блок с атрибутам? в свойствах атребуты нигде не прописаны. в DXF коде их тоже нет.

Последний раз редактировалось Кулик Алексей aka kpblc, 14.08.2016 в 22:31.
Просмотров: 7440
 
Непрочитано 30.06.2016, 16:20
#2
Puroshev


 
Регистрация: 22.10.2008
Сообщений: 73
Отправить сообщение для Puroshev с помощью Skype™


Вот так:
Код:
[Выделить все]
 (setq NewPline (vlax-safearray->list (vlax-variant-value pline)))
Puroshev вне форума  
 
Непрочитано 30.06.2016, 16:27
#3
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Совершенно необязательно брать вершины полилинии, чтобы по ним построить точно такую же. В ActiveX есть метод Copy ( vla-Copy)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 30.06.2016, 16:38
#4
Puroshev


 
Регистрация: 22.10.2008
Сообщений: 73
Отправить сообщение для Puroshev с помощью Skype™


Цитата:
2) как вставлять блок с атрибутам? в свойствах атребуты нигде не прописаны. в DXF коде их тоже нет.
Надо в Автокаде создать блок с атрибутами. Команда: _attdef
Puroshev вне форума  
 
Автор темы   Непрочитано 01.07.2016, 11:16
#5
wpww


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


Цитата:
Сообщение от Puroshev Посмотреть сообщение
Надо в Автокаде создать блок с атрибутами. Команда: _attdef
Суть в том, что я планировал обращаться к каждому конкретному блоку по значению этого атрибута.
Как я понимаю - реализовать это нельзя?
как я понимаю, придется создавать список с именами всех блоков и через него обращаться к конкретному блоку. другого выхода не вижу.
wpww вне форума  
 
Непрочитано 01.07.2016, 12:10
#6
Puroshev


 
Регистрация: 22.10.2008
Сообщений: 73
Отправить сообщение для Puroshev с помощью Skype™


wpww, если не секрет, в чем состоит задача и что в итоге надо получить?
Puroshev вне форума  
 
Автор темы   Непрочитано 01.07.2016, 17:00
#7
wpww


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


Цитата:
Сообщение от Puroshev Посмотреть сообщение
wpww, если не секрет, в чем состоит задача и что в итоге надо получить?
нужен лисп для автоматической расстановки и нумерования видеокамер на периметре объекта
суть в чем: есть полилиния - трасса расположения видеокамер, ее надо разметить блоками. тонкость в том, что после вершины полилинии нужно размечать нужно заново (чтобы начало участка отсчитывалось от вершины)
и так же чтобы автоматически проставлялась нумерация. хотел чтобы нумерация была в рамках атрибуха, чтобы потом можно было составить кабельный журнал автоматически.
wpww вне форума  
 
Непрочитано 01.07.2016, 17:09
#8
AlexZh


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


Цитата:
Сообщение от wpww Посмотреть сообщение
нужен лисп для автоматической расстановки и нумерования видеокамер на периметре объекта
суть в чем: есть полилиния - трасса расположения видеокамер, ее надо разметить блоками. тонкость в том, что после вершины полилинии нужно размечать нужно заново (чтобы начало участка отсчитывалось от вершины)
и так же чтобы автоматически проставлялась нумерация. хотел чтобы нумерация была в рамках атрибуха, чтобы потом можно было составить кабельный журнал автоматически.
как вариант:

1. имеется полилиния - трасса расположения видеокамер (pl1).
2. создается набор из камер на полилинии.
3. запрос номера начала отсчета камеры
3. функция repeat (повтор количества блоков камер набора - n)
3.1. копировать pl1 (pl2)
3.2. обрезать от точки вставки блока до конца pl2
3.3. присвоение атрибуту блока номера начала отсчета камеры
3.4. атрибуту блока номера начала отсчета камеры + 1
AlexZh вне форума  
 
Автор темы   Непрочитано 04.07.2016, 11:01
#9
wpww


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


Цитата:
Сообщение от AlexZh Посмотреть сообщение
как вариант:

1. имеется полилиния - трасса расположения видеокамер (pl1).
2. создается набор из камер на полилинии.
3. запрос номера начала отсчета камеры
3. функция repeat (повтор количества блоков камер набора - n)
3.1. копировать pl1 (pl2)
3.2. обрезать от точки вставки блока до конца pl2
3.3. присвоение атрибуту блока номера начала отсчета камеры
3.4. атрибуту блока номера начала отсчета камеры + 1
я тут подумал, а что если использовать не атрибут блока, а текст и сгруппировать его с блоком. текст внутри текста будет иметь номер этой камеры.
только у меня теперь вопрос, а можно как то получить номера объектов, входящих в одну группу?
wpww вне форума  
 
Непрочитано 04.07.2016, 12:06
#10
Puroshev


 
Регистрация: 22.10.2008
Сообщений: 73
Отправить сообщение для Puroshev с помощью Skype™


Должно получиться так???
Вложения
Тип файла: zip 01.zip (7.9 Кб, 47 просмотров)
Puroshev вне форума  
 
Автор темы   Непрочитано 04.07.2016, 15:01
#11
wpww


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


Цитата:
Сообщение от Puroshev Посмотреть сообщение
Должно получиться так???
Практически да, но есть НО:
1. нумерация должна быть сквозной
2. в месте установки камеры должен быть вставлен блок, и должен быть способ обращаться именно к этому конкретному блоку автоматически, для составления кабельного журнала.
wpww вне форума  
 
Непрочитано 04.07.2016, 15:12
#12
Puroshev


 
Регистрация: 22.10.2008
Сообщений: 73
Отправить сообщение для Puroshev с помощью Skype™


Выложи пример с блоком и участком полилинии.
Puroshev вне форума  
 
Непрочитано 08.07.2016, 07:40
#13
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


По поводу вопроса как работать с ActiveX и вариантами - найди Полещука "AutoLisp и Visual Lisp в среде автокад" В главе 6 описаны все методы работы с вариантами.
По поводу получения координат полилинии есть целая пачка команд вида vlax-curve-... (глава 6.7 там же). Суть в следующем: каждая вершина - есть целочисленный параметр. Насколько я понял задачу: надо от вершины расставлять с шагом до следующей вершины.
-getDistAtParam - получаешь расстояние на вершине n (L1) и вершине n+1 (L2).
-getPointAtDist - получаешь точки на расстояниях с заданным шагом (L1+step), пока это расстояние меньше L2.
Повторять такой маневр, пока не дойдешь до EndParam
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Автор темы   Непрочитано 11.07.2016, 14:48
#14
wpww


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


Цитата:
Сообщение от Vladimir_Sergeevich Посмотреть сообщение
По поводу вопроса как работать с ActiveX и вариантами - найди Полещука "AutoLisp и Visual Lisp в среде автокад" В главе 6 описаны все методы работы с вариантами.
По поводу получения координат полилинии есть целая пачка команд вида vlax-curve-... (глава 6.7 там же). Суть в следующем: каждая вершина - есть целочисленный параметр. Насколько я понял задачу: надо от вершины расставлять с шагом до следующей вершины.
-getDistAtParam - получаешь расстояние на вершине n (L1) и вершине n+1 (L2).
-getPointAtDist - получаешь точки на расстояниях с заданным шагом (L1+step), пока это расстояние меньше L2.
Повторять такой маневр, пока не дойдешь до EndParam
Спасибо за совет. Эта книга у меня есть в печатном виде.
А есть идея как мне привязать нумерацию камеры к конкретному блоку и чтобы, в случае необходимости, можно было бы к нему обращаться через номер?
или мне придется через массив запоминать все номера блоков в чертеже и уже через массив обращаться к конкретному блоку?
wpww вне форума  
 
Непрочитано 11.07.2016, 21:00
#15
Лентяй

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


Цитата:
Сообщение от wpww Посмотреть сообщение
А есть идея как мне привязать нумерацию камеры к конкретному блоку и чтобы, в случае необходимости, можно было бы к нему обращаться через номер?
или мне придется через массив запоминать все номера блоков в чертеже и уже через массив обращаться к конкретному блоку?
Все просто:
1. Прочти книжку.
2, С помощью книжки научись создавать наборы блоков по имени блока.
3. С помощью книжки научись читать атрибуты блоков и искать атрибут с заданным значением.
4. С помощью книжки научись пользоваться методом ObjectID-to-Object и делай с блоком все, что хочешь, к примеру, Highlight найденный блок.
5. И будет тебе щастя.
Лентяй вне форума  
 
Непрочитано 12.07.2016, 13:19
#16
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Цитата:
Сообщение от wpww Посмотреть сообщение
А есть идея как мне привязать нумерацию камеры к конкретному блоку и чтобы, в случае необходимости, можно было бы к нему обращаться через номер?
или мне придется через массив запоминать все номера блоков в чертеже и уже через массив обращаться к конкретному блоку?
что то мне подсказывает, что не очень. Судя по тому, что я знаю, что бы обращаться к блоку по атрибуту придется писать отдельную функцию, проходящую по всем вхождениям с HasAttributes :vlax-true и проверяющая содержимое атрибутов. vla-GetAttributes вернет вариант.
з.ы. (vlax-dump-object (vlax-ename->vla-object (car (entsel))) t) тебе в помощь
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Непрочитано 12.07.2016, 15:04
#17
Puroshev


 
Регистрация: 22.10.2008
Сообщений: 73
Отправить сообщение для Puroshev с помощью Skype™


Для wpww в качестве примера
Чертеж: пронумерованная полилиния со вставленными блоками.
LISP: удаление камеры по введенному номеру.
Вложения
Тип файла: dwg
DWG 2010
DELK.dwg (500.6 Кб, 37 просмотров)
Тип файла: lsp DELK.LSP (1.4 Кб, 50 просмотров)
Puroshev вне форума  
 
Автор темы   Непрочитано 20.07.2016, 16:27
#18
wpww


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


Цитата:
Сообщение от Vladimir_Sergeevich Посмотреть сообщение
По поводу вопроса как работать с ActiveX и вариантами - найди Полещука "AutoLisp и Visual Lisp в среде автокад" В главе 6 описаны все методы работы с вариантами.
По поводу получения координат полилинии есть целая пачка команд вида vlax-curve-... (глава 6.7 там же). Суть в следующем: каждая вершина - есть целочисленный параметр. Насколько я понял задачу: надо от вершины расставлять с шагом до следующей вершины.
-getDistAtParam - получаешь расстояние на вершине n (L1) и вершине n+1 (L2).
-getPointAtDist - получаешь точки на расстояниях с заданным шагом (L1+step), пока это расстояние меньше L2.
Повторять такой маневр, пока не дойдешь до EndParam
Отлично, все получилось по такому алгоритму!

----- добавлено через ~17 ч. -----
То что задумывало на первом этапе у меня получилось, но хочется привести все в божеский вид, а именно меня не устраивает то, что блок вставляется следующей строкой

(command "_-insert" "bk" (vlax-curve-GetPointAtDist pline rastoyanie) "" "" ygol )

при этом блок "bk" находится в папке с вспомогательными файлами.
а возможно при помощи команд activex вставлять блок?

Книга Полищука конечно классная, но СЛИШКОМ МНОГО информации и все не запомнишь без практики.
Если кто может, подскажите на какие разделы стоит обратить внимание в первую очередь.
Цитата:
Сообщение от Puroshev Посмотреть сообщение
Для wpww в качестве примера
Чертеж: пронумерованная полилиния со вставленными блоками.
LISP: удаление камеры по введенному номеру.
а что такое get_URL в строке:

(setq HH (car (get_URL Ob)))

Последний раз редактировалось wpww, 21.07.2016 в 10:32.
wpww вне форума  
 
Непрочитано 21.07.2016, 12:09
#19
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от wpww Посмотреть сообщение
а возможно при помощи команд activex вставлять блок?
Можно, если описание блока есть в текущем файле (читать LISP. СОЗДАНИЕ БЛОКА.)
По поводу библиотечной функции см. На заметку программистам
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 22.07.2016, 11:14
#20
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


wpww, предлагаю следующий подход: прочитать внимательно разделы 1.4-1.13, что бы получить представление по основному функционалу языка.
Что касается рисования методами activex, надо разобраться в структуре объектной модели: что бы рисовать что либо графическое есть методы vla-addLine(любой другой примитив). Если надо нарисовать блок, тут надо помнить, что блок, это не просто примитив и для него есть специальный метод vla-InsertBlock.
Найдя нужный метод, книга Полещука поможет разобраться с количеством и порядком обязательных параметров. Разобравшись с этим, можно либо написать свою библиотечную обертку для передачи нужных параметров, либо, для начала, прописывать обработку свойств по месту вставки. Или найти готовое решение.
Что бы разобраться со свойствами объекта поможет встроенная справка автокада (иерархия объектной модели очень наглядно изображена), либо
Цитата:
Сообщение от Vladimir_Sergeevich Посмотреть сообщение
з.ы. (vlax-dump-object (vlax-ename->vla-object (car (entsel))) t) тебе в помощь
Покажет и методы, применимые к чему угодно и свойства и заодно покажет, что (RO), а что можно и поменять.
А потом вместо объекта можно подсунуть что угодно, начиная с (vlax-get-acad-object), заканчивая последним, забытым богом, словарем или примитивом.
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Как в ActiveX выдернуть координаты полилинии? Как задавать атребуты блока через LISP?

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка блока из чертежа исходя из двух параметров (длина и ширина) Kairat.iskakov LISP 6 17.05.2016 15:04
Lisp. авто-нумерация атрибута блока. DonJad LISP 10 26.10.2014 02:04
lisp: Длина по полилинии до точки vosh LISP 19 15.07.2013 15:10
Координаты точки, лежащей на полилинии Al_Taron Программирование 1 27.11.2006 09:45