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

Вернуться   Форум 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.
Просмотров: 8017
 
Непрочитано 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,996


Совершенно необязательно брать вершины полилинии, чтобы по ним построить точно такую же. В 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
Сообщений: 145


Цитата:
Сообщение от 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 Кб, 48 просмотров)
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 Кб, 40 просмотров)
Тип файла: lsp DELK.LSP (1.4 Кб, 52 просмотров)
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,996


Цитата:
Сообщение от 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 вне форума  
 
Автор темы   Непрочитано 12.08.2016, 15:36
#21
wpww


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


и снова добрый день.
Я решил вопрос с тем, как расставить камеры, с тем как сделать их нумерацию и привязать ее к камерам.... но встал другой вопрос.
в данный момент я имею код вида:
Цитата:
(defun begin_activex ( / )
)
(defun rasstanovka ( / )
)
(defun numeration ( / )
)
(defun c:cctv ( / )
(begin_activex)
(rasstanovka)
(numeration)
)
Но программа не работает так как я хочу. Я хочу чтобы при запуске программы сначала запускался блок по расстановке видеокамер, потом производилась нумерация...
при структуре программы выше у меня производится расстановка камер и все. но если заменить строку
(rasstanovka)
закомментировать, то камеры без проблем про нумеруются. В чем проблема?
wpww вне форума  
 
Непрочитано 12.08.2016, 16:27
#22
ProPeller

Пастух
 
Регистрация: 16.07.2012
Питер
Сообщений: 318


Цитата:
Сообщение от wpww Посмотреть сообщение
и снова добрый день.
Я решил вопрос с тем, как расставить камеры, с тем как сделать их нумерацию и привязать ее к камерам.... но встал другой вопрос.
в данный момент я имею код вида:


Но программа не работает так как я хочу. Я хочу чтобы при запуске программы сначала запускался блок по расстановке видеокамер, потом производилась нумерация...
при структуре программы выше у меня производится расстановка камер и все. но если заменить строку
(rasstanovka)
закомментировать, то камеры без проблем про нумеруются. В чем проблема?
Ну по всей видимости в конце цикла "rasstanovka" у вас вылетает ошибка и дальше дело не идет. Включите в меню "отладка"->"прервать на ошибке" и смотрите где у вас ошибка. Ctrl+F9 выделит вам ошибку.
__________________
Автоматизация должна быть автоматической.
ProPeller вне форума  
 
Непрочитано 14.08.2016, 21:11
#23
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от wpww Посмотреть сообщение
(begin_activex)
Уж не ты ли тот горе-писака, который обманул одного моего клиента?
gomer вне форума  
 
Автор темы   Непрочитано 15.08.2016, 09:40
#24
wpww


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


Цитата:
Сообщение от gomer Посмотреть сообщение
Уж не ты ли тот горе-писака, который обманул одного моего клиента?
нет, это был кто-то другой. за деньги я не пишу. пока )))
Цитата:
Сообщение от ProPeller Посмотреть сообщение
Ну по всей видимости в конце цикла "rasstanovka" у вас вылетает ошибка и дальше дело не идет. Включите в меню "отладка"->"прервать на ошибке" и смотрите где у вас ошибка. Ctrl+F9 выделит вам ошибку.
именно в этом была проблема. спасибо за совет

----- добавлено через ~5 ч. -----
Внимание, новый вопрос:
как работает выравнивание в ActiveX?
мне нужно чтобы текст был выделен по центру, за это отвечает свойство alignment
я имею код такого вида:
Код:
[Выделить все]
 (defun numeration ( / )
  (setq nabor (ssget "_X" '((2 . "ASG")))) 
  (setq dlina_nabora (sslength nabor)) 
  (setq i 0)
  (repeat dlina_nabora
    (setq object_block (ssname nabor i)) 
    (setq block (vlax-ename->vla-object object_block)) 
    (setq nomer (vlax-lData-get block "nomer")) 
    (setq coordinata_block (vlax-safearray->list (vlax-variant-value (vla-get-InsertionPoint block)))) 
    (setq coordinata_nomer (list (nth 0 coordinata_block) (+ (nth 1 coordinata_block) 5.7) (nth 2 coordinata_block))) 
    (vla-AddText model_space (strcat "ASG" (itoa nomer)) (vlax-3D-point coordinata_nomer) 2.5)
    (vla-put-alignment text acAlignmentCenter)
    (setq i (1+ i))
  )
)
на русском языке описание использования этого свойства я не нашел.
на зарубежном форуме было написано, что выравнивание связано со свойством textAlignmentPoint, но я не понял каким образом. По факты, судя по свойсвам моих текстов, значение TextAlignmentPoint становится равным значению InsertionPoint, а InsertionPoint на новое.
Вопрос, как мне сделать выравнивание текста по центру?

----- добавлено через ~5 ч. -----
Цитата:
Сообщение от wpww Посмотреть сообщение
нет, это был кто-то другой. за деньги я не пишу. пока )))
именно в этом была проблема. спасибо за совет

----- добавлено через ~5 ч. -----
Внимание, новый вопрос:
как работает выравнивание в ActiveX?
мне нужно чтобы текст был выделен по центру, за это отвечает свойство alignment
я имею код такого вида:
Код:
[Выделить все]
 (defun numeration ( / )
  (setq nabor (ssget "_X" '((2 . "ASG")))) 
  (setq dlina_nabora (sslength nabor)) 
  (setq i 0)
  (repeat dlina_nabora
    (setq object_block (ssname nabor i)) 
    (setq block (vlax-ename->vla-object object_block)) 
    (setq nomer (vlax-lData-get block "nomer")) 
    (setq coordinata_block (vlax-safearray->list (vlax-variant-value (vla-get-InsertionPoint block)))) 
    (setq coordinata_nomer (list (nth 0 coordinata_block) (+ (nth 1 coordinata_block) 5.7) (nth 2 coordinata_block))) 
    (vla-AddText model_space (strcat "ASG" (itoa nomer)) (vlax-3D-point coordinata_nomer) 2.5)
    (vla-put-alignment text acAlignmentCenter)
    (setq i (1+ i))
  )
)
на русском языке описание использования этого свойства я не нашел.
на зарубежном форуме было написано, что выравнивание связано со свойством textAlignmentPoint, но я не понял каким образом. По факты, судя по свойсвам моих текстов, значение TextAlignmentPoint становится равным значению InsertionPoint, а InsertionPoint на новое.
Вопрос, как мне сделать выравнивание текста по центру?
проблема выравнивания у меня была связана с тем, что я сначала указывал точку выравнивания, а потом тип выравнивания, а надо было наоборот, т.к. свойство TextAlignmentPoint имеет параметр read only при выравниванию по левому краю, и по факту корректировать это свойство можно только после корректировки самого типа выравнивания, а не наоборот!

Последний раз редактировалось wpww, 15.08.2016 в 10:29.
wpww вне форума  
 
Непрочитано 16.08.2016, 08:25
#25
Vladimir_Sergeevich

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


Что то я ничего не понимаю. В 12-ой строке есть (vla-put-alignment text acAlignmentCenter), но нигде не вижу (setq text...)
Работая с activeX надо указатель на объект запомнить, если есть желание его потом подредактировать. Например в 11 строке (setq text (vla-AddText...))
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Автор темы   Непрочитано 16.08.2016, 09:44
#26
wpww


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


Цитата:
Сообщение от Vladimir_Sergeevich Посмотреть сообщение
Что то я ничего не понимаю. В 12-ой строке есть (vla-put-alignment text acAlignmentCenter), но нигде не вижу (setq text...)
Работая с activeX надо указатель на объект запомнить, если есть желание его потом подредактировать. Например в 11 строке (setq text (vla-AddText...))
Да, это у меня есть в тексте, почему то криво скопировал, когда сюда переносил...
вопрос. а как при помощи ActiveX создать новый слой? пока есть идея как это сделать через (entmake ...)
wpww вне форума  
 
Непрочитано 16.08.2016, 10:04
#27
Кулик Алексей aka kpblc
Moderator

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


(vla-add (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) "LayerName")
Только потом его надо будет настраивать: http://autolisp.ru/2014/03/05/base-s...rs-anf-styles/
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.08.2016, 11:47
#28
VVA

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


Цитата:
Сообщение от wpww Посмотреть сообщение
а как при помощи ActiveX создать новый слой?
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Только потом его надо будет настраивать
Есть же готовые функции
_kpblc-layer-create (например здесь )
или
_dwgru-layer-create (например здесь)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 16.08.2016, 12:21
#29
wpww


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


Цитата:
Сообщение от VVA Посмотреть сообщение
Есть же готовые функции
_kpblc-layer-create (например здесь )
или
_dwgru-layer-create (например здесь)
просто хочется чтобы все было в ActiveX.

в данный момент имею такой код
Код:
[Выделить все]
 
(defun GetTrueColor (r g b / )
  (+ (lsh r 16) (lsh g 8) b)
)

(defun NewLayer (name r g b line_weight line_type / ) 
  (setq layer (vla-add (vla-get-layers active_document) name)) 
  (vla-put-TrueColor layer (GetTrueColor r g b)) 
  (vla-put-LineWeight layer line_weight)
  (vla-put-LineType layer line_type)
)
GetTrueColor пересчитывает RGB в TrueColor
Но чтобы применить его на слой, необходимо чтобы значение vla-put-TrueColor было в виде vla объекта.
Как это сделать? уже всю голову сломал.
wpww вне форума  
 
Непрочитано 16.08.2016, 13:02
#30
VVA

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


Цитата:
Сообщение от wpww Посмотреть сообщение
просто хочется чтобы все было в ActiveX.
Ну так там все как раз таки активХ
А у тебя как раз таки и нет. GetTrueColor нужна для создания entmake'ом

Цитата:
Сообщение от wpww Посмотреть сообщение
Но чтобы применить его на слой, необходимо чтобы значение vla-put-TrueColor было в виде vla объекта.
Код:
[Выделить все]
(setq active_document (vla-get-activedocument (vlax-get-acad-object)))  

(defun NewLayer (name r g b line_weight line_type / TrueColor ) 
  (setq layer (vla-add (vla-get-layers active_document) name))
  (setq TrueColor (vla-get-truecolor layer))
  (vla-setrgb TrueColor r g b)
  (vl-catch-all-apply (function vla-put-Truecolor) (list layer TrueColor))
  (vla-put-LineWeight layer line_weight)
  (vla-put-LineType layer line_type)
)
;;;Use
;;; (NewLayer "TestLayer" 213 20 136 50 "Continuous")
Тип линии, отличный от "Continuous" должнен быть загружен
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 16.08.2016, 13:55
#31
wpww


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


Цитата:
Сообщение от VVA Посмотреть сообщение
Ну так там все как раз таки активХ
А у тебя как раз таки и нет. GetTrueColor нужна для создания entmake'ом



Код:
[Выделить все]
(setq active_document (vla-get-activedocument (vlax-get-acad-object)))  

(defun NewLayer (name r g b line_weight line_type / TrueColor ) 
  (setq layer (vla-add (vla-get-layers active_document) name))
  (setq TrueColor (vla-get-truecolor layer))
  (vla-setrgb TrueColor r g b)
  (vl-catch-all-apply (function vla-put-Truecolor) (list layer TrueColor))
  (vla-put-LineWeight layer line_weight)
  (vla-put-LineType layer line_type)
)
;;;Use
;;; (NewLayer "TestLayer" 213 20 136 50 "Continuous")
Тип линии, отличный от "Continuous" должнен быть загружен
отлично, спасибо!
единственное что, я заменил строчку

Код:
[Выделить все]
 (vl-catch-all-apply (function vla-put-Truecolor) (list layer TrueColor))
на

Код:
[Выделить все]
 (vla-put-TrueColor layer TrueColor)
для меня так понятней смысл написанного
wpww вне форума  
 
Непрочитано 16.08.2016, 14:17
#32
ProPeller

Пастух
 
Регистрация: 16.07.2012
Питер
Сообщений: 318


Цитата:
Сообщение от wpww Посмотреть сообщение
отлично, спасибо!
единственное что, я заменил строчку

Код:
[Выделить все]
 (vl-catch-all-apply (function vla-put-Truecolor) (list layer TrueColor))
на

Код:
[Выделить все]
 (vla-put-TrueColor layer TrueColor)
для меня так понятней смысл написанного
потом опять начнете говорить, что где-то не работает, а где не знаю.
__________________
Автоматизация должна быть автоматической.
ProPeller вне форума  
Ответ
Вернуться   Форум 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