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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VLA-***

VLA-***

Ответ
Поиск в этой теме
Непрочитано 06.07.2006, 18:45 #1
VLA-***
mmax
 
Программист широкого профиля.
 
Челябинск
Регистрация: 08.09.2005
Сообщений: 722

Например надо вставить какойнибудь метод в текущее пространство MODELSPACE или PAPERSPACE.

Как прочитать какой SPACE активный.
Надоли учитывать то, что например открыт ЛИСТ 20 или же PAPERSPACE это и есть любой открытый Лист.

И еще ньюанс, хотя он может быть надуманным,
В листе активен видовой экран, и если пользоваться обычными средствами автокада, то объекты добавляются в модель, а в ЛИСПЕ по идее активен PAPERSPACE. По условию задачи надо вставить метод только в АКТИВНЫЕ места :?:

А еще, активными бывают слои и стили, по моему мнению, эти вещи надо просто проигнорировать.

А также, какие еще нюансы меня могут поджидать при добавлении метода во все активное.
Просмотров: 7080
 
Непрочитано 06.07.2006, 22:58 Re: VLA-***
#2
Лентяй

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


Цитата:
Сообщение от mmax
Например надо вставить какойнибудь метод в текущее пространство MODELSPACE или PAPERSPACE.

Как прочитать какой SPACE активный.
По значению переменной CVPORT. Если 1 - PaperSpace если 2 - ModelSpace а если 3 и более - то активиный ViewPort.
Цитата:
Надоли учитывать то, что например открыт ЛИСТ 20 или же PAPERSPACE это и есть любой открытый Лист.
PaperSpace активного (открытого) layout'a (листа).
Цитата:
И еще ньюанс, хотя он может быть надуманным,
В листе активен видовой экран, и если пользоваться обычными средствами автокада, то объекты добавляются в модель, а в ЛИСПЕ по идее активен PAPERSPACE. По условию задачи надо вставить метод только в АКТИВНЫЕ места :?:
Не мудрствуй, и будет тебе щастя. Вставка производится в соответсвии со значением CVPORT. Если CVPORT /= 2, то переключение призводится
Код:
[Выделить все]
 (vla-put-activespace adoc [0 или 1])
Цитата:
А еще, активными бывают слои и стили, по моему мнению, эти вещи надо просто проигнорировать. А также, какие еще нюансы меня могут поджидать при добавлении метода во все активное.
Мыслишь правильно, а нюансы могут быть самые разные.
Лентяй вне форума  
 
Автор темы   Непрочитано 19.08.2006, 18:35
#3
mmax

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


Нашел такие функции
Vla-getpoint
Vla-getangle
Vla-getcorner
И много других функций соответствующих обычным get-функциям.

В качестве первого аргумента им надо передать Vla-объект. Вот только какой объект? Пробовал model-space – не получается.

Мои рассуждения такие:
Функция Vla-getpoint должна дать возможность выбрать точку в интерактивном режиме в графическом окне и возвратить вариант в WCS, что очень удобно при построении объектов с помощью Vla-add*, не нужно заморачиваться на трансформацию координат если они не WCS и не нужно преобразовывать координаты в вариант в отличии от простой getpoint.
В справочной системе сказано примерно тоже самое о чем я подумал кроме объекта. Какойже тогда объект надо передавать??????????????????????????
mmax вне форума  
 
Непрочитано 19.08.2006, 19:36
#4
BigBrother

Design & programming :)
 
Регистрация: 14.02.2004
Новосибирск
Сообщений: 172
<phrase 1= Отправить сообщение для BigBrother с помощью Skype™


Цитата:
Вот только какой объект?
(vla-GetPoint (vla-get-Utility (vla-get-ActiveDocument(vlax-get-acad-object))) nil "Get Point")

VBA class name:
AcadUtility

Create using:
N/A

Access via:
Document.Utility
BigBrother вне форума  
 
Автор темы   Непрочитано 19.08.2006, 22:21
#5
mmax

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


Очень хорошо. Спасибо.

А как добавить vla-объект в блок.
Например в пространстве модели нарисована окружность и она должна войти в блок.

Как создать пустой блок я догадался:
(setq blk (vla-add (vla-get-blocks
(mmax-active-document);my-function
)
(vlax-3d-point 0 0 0) "blkname"))
применимые методы позволяют рисовать только новые объекты(есть еще несколько методов, предназначение которых мне не очень понятно), а как добавить имеющиеся???
mmax вне форума  
 
Непрочитано 19.08.2006, 23:20
#6
BigBrother

Design & programming :)
 
Регистрация: 14.02.2004
Новосибирск
Сообщений: 172
<phrase 1= Отправить сообщение для BigBrother с помощью Skype™


Цитата:
Сообщение от mmax
а как добавить имеющиеся???
Рад буду ошибиться, но скорее всего посредством ActiveX никак.
BigBrother вне форума  
 
Непрочитано 20.08.2006, 00:04
#7
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Цитата:
Сообщение от mmax
>>а как добавить имеющиеся???
Пробовал давно, но получается коряво,
поскольку отмена не выходит
Выбери вставку блока на экране а потом окружность
Переделай по вкусу

Код:
[Выделить все]
 (defun C:AEB (/ acsp adoc blks blk_ref circ_obj sfar util)
 (vl-load-com)
        (setq adoc (vla-get-activedocument
		 (vlax-get-acad-object)
	       )
	      acsp (vla-get-modelspace adoc)
	      blks (vla-get-blocks adoc)
	      util (vla-get-utility adoc))
  (vla-endundomark adoc)
  (vla-startundomark adoc)
  
  (while  (or
  (vla-getentity util  'blk_ref 'pt "Select a block reference: ")
  (vla-getentity util  'circ_obj 'pn "Select a circle to add to block: ")))
  (vlax-invoke circ_obj 'Move
        (vlax-get circ_obj 'Center) '(0. 0. 0.))
  (setq sfar  (vlax-make-variant
		   (vlax-safearray-fill
		     (vlax-make-safearray vlax-vbObject '(0 . 0))
            (list circ_obj))))
    
    (vla-copyobjects adoc sfar
    (vla-item blks 
	      (vlax-get blk_ref 'Name)) 'idpair); idpair - optional
   (vlax-invoke circ_obj 'Delete)
   (mapcar (function (lambda(x)
		       (vlax-release-object x)))
	   (list circ_obj blk_ref))
    (vla-regen adoc acactiveviewport)
    (vla-endundomark adoc)
    (princ)
    )
(prompt "\ntype AEB to execute ...\n")
(princ)
Fatty

~'J'~
fixo вне форума  
 
Непрочитано 21.08.2006, 09:30 Re: VLA-***
#8
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Например надо вставить какойнибудь метод в текущее пространство MODELSPACE или PAPERSPACE.
Как прочитать какой SPACE активный.
Надоли учитывать то, что например открыт ЛИСТ 20 или же PAPERSPACE это и есть любой открытый Лист.
И еще ньюанс, хотя он может быть надуманным,
В листе активен видовой экран, и если пользоваться обычными средствами автокада, то объекты добавляются в модель, а в ЛИСПЕ по идее активен PAPERSPACE. По условию задачи надо вставить метод только в АКТИВНЫЕ места :?:
Код:
[Выделить все]
;|=============================================================================
*    Функция возвращает vla-активное пространство (лист / модель).
*    Взято с ruCAD
*    Параметры вызова:
*        Нет
*    Примеры вызова:
(_kpblc-get-active-space-obj)
=============================================================================|;
(defun _kpblc-get-active-space-obj ()
(if (and (zerop (vla-get-activespace *kpblc-activedoc*))
         (= :vlax-false (vla-get-mspace *kpblc-activedoc*))
         ) ;_ end of and
  (vla-get-paperspace *kpblc-activedoc*)
  (vla-get-modelspace *kpblc-activedoc*)
  ) ;_ end of if
) ;_ end of defun
Цитата:
А еще, активными бывают слои и стили, по моему мнению, эти вещи надо просто проигнорировать.
Не всегда. Иногда приходится создавать новый слой, к примеру, его активировать, работать в нем, потом возвращать обратно.
Цитата:
А также, какие еще нюансы меня могут поджидать при добавлении метода во все активное.
по-моему, метод добавить нельзя. Применить - можно, но не добавить.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.08.2006, 11:49
#9
ShaggyDoc

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


Цитата:
по-моему, метод добавить нельзя. Применить - можно, но не добавить.
Да уж. В начале ветки mmax вообще хотел "вставить какойнибудь метод". Да еще "во все активное".

С неточности в терминологии начинаются неточные вопросы. А справку почему не открыть и не прочитать внимательно? Там все написано! Особенно если щелкать по стрелчкам вверхи вниз на странице описания объекта.

Тогда и не будет "я догадался", "мои рассуждения такие", "о чем я подумал".

Что касается таинственных VLA-объектов, то в LISР-функциях всегда первым аргументом передается объект, а далее - остальные аргументы, приводимые в "бейскиковых" примерах.

Еще воможен разный синтаксис. Например, Fatty

написал

Код:
[Выделить все]
(vlax-invoke circ_obj 'Move (vlax-get circ_obj 'Center) '(0. 0. 0.))
а можно и

Код:
[Выделить все]
(vla-Move circ_obj  (vlax-get circ_obj 'Center) '(0. 0. 0.))
или
Код:
[Выделить все]
(vla-Move circ_obj (vla-get-center circ_obj) '(0. 0. 0.))
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 27.08.2006, 20:05
#10
mmax

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


Код:
[Выделить все]
(vla-InitializeUserInput (vla-get-Utility (vla-get-ActiveDocument(vlax-get-acad-object)))  128)

(vla-getpoint (vla-get-Utility (vla-get-ActiveDocument(vlax-get-acad-object)))  )
Скажите пожалуйста. почему бит128 здесь не работает при попытке ввести символы с клавиатуры. Возвращает ошибку.

Код:
[Выделить все]
(initget 128)
(getpoint)
А вот таккой код работает нормально.
mmax вне форума  
 
Непрочитано 28.08.2006, 00:20
#11
Лентяй

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


Потому что, начавши какое дело, его следует доводить до конца. Код 128 используется для ввода с клавы улючевых слов (keyword) Как, спрашивается, глупая машина, хучь бы и с АвтоКадом, узнаит, каких именно ключевых слов вам бы хотелось? Потому писать следует так:
Код:
[Выделить все]
(vla-InitializeUserInput (vla-get-Utility (vla-get-ActiveDocument(vlax-get-acad-object)))  128 "Вася Дурак")
(setq kw (vla-getkeyword (vla-get-Utility (vla-get-ActiveDocument(vlax-get-acad-object))) (strcat "\nВыбрать [Вася/Дурак]: "))
А для выбоа точки на экране с помощью vla-getPoint инициализация ваще не нужна.
Лентяй вне форума  
 
Автор темы   Непрочитано 28.08.2006, 19:20
#12
mmax

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


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

Код:
[Выделить все]
Команда: Укажите вершину угла или введите угол с клавиатуры : Вася_дурак
Требуется указать точку или ввести число
Укажите вершину угла или введите угол с клавиатуры : 128
Здесь мы получили вместо точки строку "128" как угол в градусах.
если пользователь укажет точку то будет предложено указать еще две из этих трех точек будет сформирован угол, тоесть пользователю предлагается указать угол визуально.

нечто подобное есть здесь http://dwg.ru/dwl/index.php?id=845
там надо выбрать "сегмент", угол предлагается создать только по трем точкам.

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


(initget 128)
(getpoint "Укажите точку:") может это реализовать если я вместо точки введу число, буквы и другие символы, то возвратится строка с этими символами
mmax вне форума  
 
Непрочитано 28.08.2006, 22:01
#13
Лентяй

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


Цитата:
Сообщение от mmax
У меня идея такая: предложить пользователю указать точку на экране или ввести число с клавиатуры без всяких опций. возвращается точка или число.
Не совсем понятно, к чему будет пристегиваться угол, если вводится просто число. МБ, имеет смысл применить vla-getEntity, тогда будет возвращаиься примитив в виде объекта, и точка выбора.
Да, а что касается vla-getPoint, то у вас ошибка в коде - пропущена точка ссылки. Сделайте так:
Код:
[Выделить все]
(vla-getpoint (vla-get-utility (vla-get-ActiveDocument (vlax-get-acad-object))) nil "Введите точку")
и будет вам щастя.
Лентяй вне форума  
 
Автор темы   Непрочитано 28.08.2006, 23:08
#14
mmax

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


Если быть кратким:
Я хочу предложить пользователю в ОДНОМ запросе указать точку или ввести число, одно из двух.
Если введено число , то это число и будет значением угла и операция на этом закончится.
Если указана точка, то операция получения угла по трем точкам будет продолжена.

Но вот что мне удалось выяснить.
В справке сказано:
Если полльзователь ввел keyword то Акад выдаст ошибку. keyword потом можно прочитать с помощью vla-getinput. В чем я убедился.
Но мне не нужна ошибка так как она прервет всю программу. И keyword я хочу прочитать сразуже а не в обработчике ошибок.
Как то странно все здесь сделано.
mmax вне форума  
 
Непрочитано 28.08.2006, 23:57
#15
Лентяй

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


Тогда ысе ваще просто. Вам нужна функция vla-getAngle
Код:
[Выделить все]
(vla-getangle (vla-get-utility (vla-get-ActiveDocument (vlax-get-acad-object))) nil "Введите угол")
При вводе числа градусов с клавы она возвращает угол в радианах, а при указаниии точки на экране просит ввести вторую точку и возвращает угол к горизонтали в радианах.
Лентяй вне форума  
 
Автор темы   Непрочитано 29.08.2006, 21:28
#16
mmax

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


Нет, угол к горизонтали, а скорее всего к ANGBASE, не подходит так как я хочу указать его по трем точкам, Чтото врде опорного угла в команде _ROTATE.

Задача такая:
1. Указать вершину угла
2. указать первую сторону (резиновая нить от вершины до точки)
3. указать вторую сторону (резиновая нить от вершины)

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

Я немного разочарован в VLA-getметодах. Оказалось что vla-getpoint возвращает точку в ПСК, а VLAобъектам нужно передавать только в МСК. Нуда ладно, разберемся.

А вот еще вопрос есть ли в ActiveX функции идентичные SSGET, и можно ли там применять такиеже фильтры. Вот тут бы было небольшое преимущество так как SSGET работает медленно и если выбрать более 70000 объектов то и вовсе зависает, а более 150000 даже не просыпается.
mmax вне форума  
 
Непрочитано 30.08.2006, 08:05
#17
Лентяй

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


Цитата:
Сообщение от mmax
Нет, угол к горизонтали, а скорее всего к ANGBASE, не подходит так как я хочу указать его по трем точкам, Чтото врде опорного угла в команде _ROTATE.

Задача такая:
1. Указать вершину угла
2. указать первую сторону (резиновая нить от вершины до точки)
3. указать вторую сторону (резиновая нить от вершины) теперь имеются три точки характеризующие две линии пересекающиеся в точке указанной вершины. угол высчитывается от первой стороны до второй по направлению указанном в переменной ANGDIR.
у меня уже реализован этот алгоритм, но в нем невозможно ввести число.
Как я уже говорил. функция vla-getAngle допускает оба ввода без инициализации.
Код:
[Выделить все]
 (apply '- (mapcar '(lambda (x) (vla-getAngle (vla-get-Utility (vla-get-ActiveDocument (vlax-get-acad-object)))) (strcat "Введите " x " угол: ")) '("первый" "второй"))
Цитата:
Я немного разочарован в VLA-getметодах. Оказалось что vla-getpoint возвращает точку в ПСК, а VLAобъектам нужно передавать только в МСК. Нуда ладно, разберемся.
Вот горе-то :twisted: ! Про функцию trans, преобразаывающую координаты туда-обратно, вам, я так думаю, неизвестно.
Цитата:
А вот еще вопрос есть ли в ActiveX функции идентичные SSGET, и можно ли там применять такиеже фильтры.
Голубчик, а вы в "HELP" ваще-то хоть иногда заглядывете? Искренне советую, потому как там находятся ответы почти на все вопросы подобного рода.
Цитата:
Вот тут бы было небольшое преимущество так как SSGET работает медленно и если выбрать более 70000 объектов то и вовсе зависает, а более 150000 даже не просыпается.
так вы и за форумом не следите? Попробуйте поиск на vla-select - откроете для себя много интересного.
Лентяй вне форума  
 
Непрочитано 30.08.2006, 10:02
#18
VVA

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


Цитата:
А вот еще вопрос есть ли в ActiveX функции идентичные SSGET
Навскидку
ssget и vla-get-ActiveSelectionSet
Глючит vla-SelectOnScreen! Знатоки ActiveX - отзовитесь!
http://www.afralisp.net/vl/selsets.htm
VxSsetSelect - ActiveX counterpart to 'ssget'

Последний раз редактировалось VVA, 19.09.2015 в 00:05.
VVA вне форума  
 
Автор темы   Непрочитано 30.08.2006, 22:09
#19
mmax

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


Все советуют заглянуть в справку.
Я конечно туда заглядываю. Единственная проблема -- это незнание названий функций и плохое знание английского. Иногда бывает, что я не могу внятно перевести текст, вот и спрашиваю у знающих людей.
mmax вне форума  
 
Непрочитано 31.08.2006, 00:45
#20
Лентяй

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


Про неоднократно упоминавшуюся здесь книгу Н.Н. Полищука "AutoLISP и VisualLISP в среде AutoCAD" вы тоже не слышали?
Лентяй вне форума  
 
Автор темы   Непрочитано 01.09.2006, 00:02
#21
mmax

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


Цитата:
"AutoLISP и VisualLISP в среде AutoCAD"
С таким названием не встречал. Но коекакие есть. И найти в них то незнаю чего очень проблематично, хотя на vla-getметоды я как раз там и наткнулся, совершенно случайно, и информации по ним там практически нет, просто написано -- мол есть вот такие.

Но всетаки я реализовал то что хотел по запросу угла.
Выкладывать код не имеет смысла изза библиотечных функций, типа перевода градусов в радианы, активных space и др objects итп.

Но я собрал их в VLX-файл и вы можете посмотреть реализацию на практике. Там получение угла реализовано несколько лучше и функции getangle vla-getangle вообще не используются.

Но вопрос по vla-getметодам остается открытым:
Код:
[Выделить все]
(initget "чтото_Другое еще_чегоНибудь)
(getpoint "укажите точку или  [чтото_Другое / еще_чегоНибудь] : ")
Если я укажу опцию, то результат будет положительным -- опцию возвратит, если (initget 128) то можно вместо точки ввести любой текст и возвратит этот текст.
А вот у vla-соплеменников в любом случае сначала возвратит ошибку, а уже потом после ошибки я смогу прочитать keyword с помощью vla-getinput. Тоесть дальнейшие действия я смогу проделать только в функции *error*. Справка это подтверждает.
И вот вопрос: а зачем все так коряво придумано? Функция *error* предназначена совсем для других действий и использовать ее как основную программу очень не хочется.
mmax вне форума  
 
Непрочитано 01.09.2006, 08:40
#22
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от mmax
Цитата:
"AutoLISP и VisualLISP в среде AutoCAD"
С таким названием не встречал.
http://www.private.peterlink.ru/pole.../Alisp2006.htm
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VLA-***