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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Опять про _INSERT и диалоговое окно выбора опций

Опять про _INSERT и диалоговое окно выбора опций

Ответ
Поиск в этой теме
Непрочитано 18.01.2011, 10:54 #1
Опять про _INSERT и диалоговое окно выбора опций
swkx
 
Регистрация: 22.01.2010
Сообщений: 311

Вопрос о применении _INSERT поднимался столько раз, что даже неудобно начинать опять, но и пересмотреть все сообщения тоже нереально))
Поэтому напомните, плиз, почему ввод с командной строки
_-insert и (vl-cmdf "_-insert") даёт одинаковые результаты, а
_insert и (vl-cmdf "_insert") разные:в 1-м случае выдается диалоговое окно, во 2-м ввод имени блока и параметров предлагается с ком. строки ?
AutoCAD 2009.
Просмотров: 14458
 
Непрочитано 18.01.2011, 11:40
#2
Profan


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


Видимо, так было испокон веков. Во всяком случае, в AutoCAD 2004 происходит тоже самое.
Profan вне форума  
 
Автор темы   Непрочитано 18.01.2011, 11:43
#3
swkx


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


Т.е. программно вытащить диалоговое окно выбора имени блока и опций не получится ?
swkx вне форума  
 
Непрочитано 18.01.2011, 11:53
#4
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Цитата:
Сообщение от swkx Посмотреть сообщение
Т.е. программно вытащить диалоговое окно выбора имени блока и опций не получится ?
Почему не получиться, получиться
Код:
[Выделить все]
(vla-Sendcommand (vla-get-ActiveDocument (vlax-get-acad-object)) "_insert ")
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 18.01.2011, 12:41
#5
ShaggyDoc

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


Если "пересмотреть все сообщения тоже нереально", то почему бы не заглянуть в справку, где говорится об опциях командной строки? Это самый правильный путь.

"_-insert" и "_insert" - разные варианты вызова команды.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 18.01.2011, 12:47
#6
swkx


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


2 TararykovDG

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

2 ShaggyDoc,

"_-insert" и "_insert" ведут себя по-разному, как и положено, с этим всё ясно, а вот
(vl-cmdf "_insert") и (vl-cmdf "_-insert") ведут себя одинаково, вот в чем вопрос !
swkx вне форума  
 
Непрочитано 18.01.2011, 12:47
#7
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


А как вариант попробовать обойтись без командной строки (DXF VLA)?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 18.01.2011, 12:49
#8
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 6,013


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
"_-insert" и "_insert" - разные варианты вызова команды.
Разные, но с vl-cmdf и command различия в работе нету независимо от опции. Вы невнимательно прочитали вопрос.
Nike вне форума  
 
Автор темы   Непрочитано 18.01.2011, 13:17
#9
swkx


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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
А как вариант попробовать обойтись без командной строки (DXF VLA)?
Например ?..
swkx вне форума  
 
Непрочитано 18.01.2011, 13:21
#10
Profan


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


Выключить командную строку Ctrl+9.
Profan вне форума  
 
Непрочитано 18.01.2011, 14:18
#11
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от swkx Посмотреть сообщение
Например ?..
Код:
[Выделить все]
(vla-insertblock (vla-get-modelspace(vla-get-activedocument(vlax-get-acad-object)))
                      (vlax-3d-point (getpoint "\nТочка вставки: "))
                  "ИМЯ БЛОКА"
                      1 1 1 0)
P.S. до вызова должен быть "активирован" (vl-load-com)
p.p.s - можно и через dxf (тогда vl-load-com не нужен) - там сам блок ихмо покрасивей всавляется, но если с аттрибутами - то "возьня" начинается.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 18.01.2011 в 14:31.
Дима_ вне форума  
 
Непрочитано 18.01.2011, 14:22
#12
ShaggyDoc

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


Цитата:
Сообщение от Nike Посмотреть сообщение
Разные, но с vl-cmdf и command различия в работе нету независимо от опции. Вы невнимательно прочитали вопрос.
Почему же невнимательно. Внимательно. Автор темы сравнивает "зеленое с квадратным". Т.е. штатную команду Автокада с вызовом функции.

Команда предназначена для вызова штатного диалога. Функция, вызывающая команду INSERT в любых вариантах не вызовет диалоговое окно, так как в нем нет смысла (оно ничего не возвратит).

Команды предназначены для обычных пользователей, а функции - для программирования. Программирование вставки блоков связано с передачей аргументов (имени блока, масштаба, поворота) и вызов здесь штатного диалога не нужен. Если нужен какой-то диалог, он пишется самостоятельно.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 18.01.2011, 14:47
#13
swkx


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


ShaggyDoc,

обстоятельный ответ, не поспоришь))

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

Вопрос можно считать исчерпанным
swkx вне форума  
 
Непрочитано 18.01.2011, 14:47
#14
Profan


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


Однако, выражение из сообщения #4
Код:
[Выделить все]
(vla-Sendcommand (vla-get-ActiveDocument (vlax-get-acad-object)) "_insert ")
кое-что "возвращает".
Profan вне форума  
 
Автор темы   Непрочитано 19.01.2011, 12:28
#15
swkx


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


Неожиданно наткнулся на простое решение:

(initdia)
(vl-cmdf "_insert")

Эта связка вызывает диалоговое окно вставки блока
Похоже, все про него забыли
swkx вне форума  
 
Непрочитано 19.01.2011, 12:47
#16
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 6,013



http://www.caduser.ru/forum/index.ph...6#message30176
Nike вне форума  
 
Непрочитано 19.01.2011, 14:13
#17
ShaggyDoc

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


Цитата:
(initdia)
(vl-cmdf "_insert")
Да не забыли про это. Программисту сам факт вывода диалога вставки блока ничего не дает. Если бы ещё, предположим, после обработки диалога можно было бы получить список созданных в нем параметров или NIL при отмене, то какой-то смысл был бы.

В каких-то других случаях, с другими командами, наподобие PLOT, смысл может быть.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 19.01.2011, 14:39
#18
swkx


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


ShaggyDoc,

я, когда писал "забыли", в основном себя имел в виду

Вопрос чисто теоретический: ты допускаешь вариант, что в LISP-программе выполняются какие-то действия, построения, вычисления и т.д. и т.п. и в самом конце пользователю предоставляется возможность осуществить вставку блока ?
Как он этой возможностью воспользуется, уже никого не интересует, в т.ч. и программу, которая ему эту возможность предоставила...
swkx вне форума  
 
Непрочитано 19.01.2011, 18:32
#19
ShaggyDoc

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


Цитата:
Вопрос чисто теоретический: ты допускаешь вариант, что в LISP-программе выполняются какие-то действия, построения, вычисления и т.д. и т.п. и в самом конце пользователю предоставляется возможность осуществить вставку блока ?
Как он этой возможностью воспользуется, уже никого не интересует, в т.ч. и программу, которая ему эту возможность предоставила...
Нет, не допускаю. Программы, связанные со вставками блока для того и делаются, чтобы облегчить жизнь. Т.е. не думать о имени блока, масштабе. Программная вставка блока должна дать пользователю задать точку вставки (и то не всегда) и угол поворота (и то не всегда).

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

Вот уметь управлять вызовом этого диалога надо уметь, там тоже есть тонкости.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 19.01.2011, 19:04
#20
swkx


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


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Программная вставка блока должна дать пользователю задать точку вставки (и то не всегда) и угол поворота (и то не всегда).
Я с этим на 99% согласен. Сходу тоже не могу придумать ситуацию, в которой пользователь не знает масштабы по X и Y (а может даже и базовую точку!), пока не увидит висящий на курсоре блок, но просто уверен, что такие задачи встречаются.
swkx вне форума  
 
Непрочитано 19.01.2011, 22:01
#21
ShaggyDoc

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


Цитата:
не могу придумать ситуацию, в которой пользователь не знает масштабы по X и Y
При использовании программы пользователю не надо знать про масштабы. Это программа должна масштабировать в зависимости от того, что это за блок - условное обозначение или "реальный" объект.

Исключением, пожалуй являются случаи "визуального" масштабирования специальных "украшательских" блоков, каких-нибудь деревьев на фасадах. Так и там масштаб знать не надо, надо просто растянуть изображение мышкой.
ShaggyDoc вне форума  
 
Непрочитано 19.01.2011, 23:36
#22
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Как раз по поводу визуального украшения - когда вставляешь блок командными методами - на курсоре "висит" его изображние - сделать нечто подобное в лиспе можно либо, через API express tools (но они не факт что установлнны), либо через grread + куча обработки, отслеживаний и пр. - то есть гемор для "красоты" получается приличный (хотя можно 1 раз с силами собратся и написать).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 19.01.2011, 23:40
#23
swkx


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


Надо же, я тоже про расстановку деревьев на лужайке подумал))))

Так это и есть тот самый случай - пользователь ДО указания точки вставки не знает, какие будут коэффициенты.
swkx вне форума  
 
Непрочитано 20.01.2011, 06:36
#24
ShaggyDoc

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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Как раз по поводу визуального украшения - когда вставляешь блок командными методами - на курсоре "висит" его изображние - сделать нечто подобное в лиспе можно либо, через API express tools (но они не факт что установлнны), либо через grread + куча обработки, отслеживаний и пр. - то есть гемор для "красоты" получается приличный (хотя можно 1 раз с силами собратся и написать).
Многократная (однократная - очень просто) вставка блока, "висящего" на курсоре - очень нужная задача. Причем блока, отмасштабированного и повернутого. Блок должен быть виден именно до указания точки вставки, чтобы пользователь мог видеть, как он вписывается в обстановку. Обычно это разные условные обозначения, например деревья для топографии или отметки на плане.

Должно учитываться, что блок может иметь атрибуты самых разных видов. И то, что разные Автокады имеют особенности, связанные с INSUNIT и с аннотативностью.

Должен быть цикличный запрос: Точка вставки <Выход>:
с завершение работы пустым вводом. ESC при этом блокируется.

Такую универсальную функцию мы с Alaspher-ом делали лет 10 в разных вариантах. Приходилось применять разные хитрые методы и бороться с "особенностями" каждой новой версии AutoCAD. Подробно история описана в "САПР на базе AutoCAD....". Да и на форуме где-то долго обсуждали.

Но все найденные решения оказались непригодными для работы в 3D - а там тоже так блоки надо вставлять, например высотных отметок. Да ещё в нужной ПСК и плоскости.

В результате пришлось сделать прерывание цикла вставки по ESC, а функция стала очень простой. Запрос:

Точка вставки или ESC для выхода:

Иначе никакой возможности нет.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 20.01.2011, 08:08
#25
swkx


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


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
В результате пришлось сделать прерывание цикла вставки по ESC, а функция стала очень простой. Запрос:

Точка вставки или ESC для выхода:
т.е. используется (vl-cmdf "_insert" ... ) в разных вариантах как самый универсальный метод ?
swkx вне форума  
 
Непрочитано 20.01.2011, 09:59
#26
ShaggyDoc

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


Цитата:
т.е. используется (vl-cmdf "_insert" ... ) в разных вариантах как самый универсальный метод ?
Да. Когда надо визуально вставлять блок, никакие объектные методы не помогут. Только команда, причем не через command, а через vl-cmdf.

Кроме того, команда всегда работает в текущей ПСК, что значительно упрощает дело.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 20.01.2011, 11:59
#27
swkx


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


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Многократная (однократная - очень просто) вставка блока, "висящего" на курсоре - очень нужная задача. Причем блока, отмасштабированного и повернутого. Блок должен быть виден именно до указания точки вставки, чтобы пользователь мог видеть, как он вписывается в обстановку.
А чем такая конструкция не подходит ?:

(while
(vl-cmdf "_insert" blockname pause 1 1 pause) ; в данном случае с запросом угла поворота
)

По ESC цикл прервется.
Дешево и сердито
swkx вне форума  
 
Непрочитано 20.01.2011, 12:35
#28
ShaggyDoc

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


Цитата:
А чем такая конструкция не подходит ?:
Попробуй выполнить все указанные мной ранее условия. Да еще, чтобы прерывался цикл, а не вся программа. Разумеется, цикл while будет. Но не все так дешево...
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 20.01.2011, 13:41
#29
swkx


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


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Попробуй выполнить все указанные мной ранее условия. Да еще, чтобы прерывался цикл, а не вся программа.
Вот, извольте
Код:
[Выделить все]
(defun test-insblock-multi ()
	(while
		(vl-cmdf "_insert" "blok1" pause 1 1 pause)
	)
	(while
		(vl-cmdf "_insert" "blok2" pause 1 1 0 "")
	)

	(alert "Два раза тыкнули ESC и работаем дальше")
)
ESC срабатывает только внутри своего цикла и не прерывает работу программы, нужный блок висит на курсоре до вставки.
Какие условия не выполнены ?

Последний раз редактировалось swkx, 20.01.2011 в 14:06.
swkx вне форума  
 
Непрочитано 20.01.2011, 14:44
#30
ShaggyDoc

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


Цитата:
Вот, извольте
Условия не выполнены. Блок не отмасштабирован предварительно, не повернут (возможно), нет приглашения для вставки. Где атрибуты? И тренируйся на конкретных блоках, непременно с атрибутами разных типов.

Если бы всего лишь в цикл завернуть, разве бы бились столько... Сделай реальную программу для реального блока. Хотя бы какой-нибудь значок наподобие отметки вставлять. Да чтобы масштабировалось автоматически и правильно. В модели, в листе.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 20.01.2011, 15:49
#31
swkx


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


Как-то так:
Код:
[Выделить все]
(defun test-insblock-multi ()
	(setq psx 2 psy 3)
	(setvar "ATTDIA" 1)
	(while
		(vl-cmdf "_insert" "blok1"
				 "_pxscale" psx "_pyscale" psy "_protate" 45
				 pause psx psy pause)
	)
)
Блок предварительно отмасштабирован и повернут.
В таком варианте выдается стандартное приглашение:
«Точка вставки или [Базовая точка/Масштаб/X/Y/Z/ПОворот]:»
Можно и его заменить на своё, но кто его вообще читает после миллиона использований

После вставки блока вывалится окно для заполнения атрибутов.

Что ещё нужно проектировщику для полного счастья ?
swkx вне форума  
 
Непрочитано 20.01.2011, 17:51
#32
ShaggyDoc

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


Цитата:
Можно и его заменить на своё
Не можно, а обязательно нужно. Представь, что видя опции, пользователь попробует их зачем-то вводить. Текст приглашения надо передать аргументом.

А теперь где-то вне программы установи (setvar "ATTREQ" 1) и погоняй. И делай всё не так, "как надо", а как может сделать пользователь. Например, не укажи точку. И блок возьми из другого файла, в котором были не такие, как в этом INSUNITS.

И задавай поворот не 45, а в виде аргумента. Если задан - то поворот не запрашивается, а если NIL - запрашивается угол поворота, разумеется с понятным приглашением.
ShaggyDoc вне форума  
 
Непрочитано 20.01.2011, 17:52
#33
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Должен быть цикличный запрос: Точка вставки <Выход>:
с завершение работы пустым вводом. ESC при этом блокируется.

Такую универсальную функцию мы с Alaspher-ом делали лет 10 в разных вариантах. Приходилось применять разные хитрые методы и бороться с "особенностями" каждой новой версии AutoCAD. Подробно история описана в "САПР на базе AutoCAD....". Да и на форуме где-то долго обсуждали.

Но все найденные решения оказались непригодными для работы в 3D - а там тоже так блоки надо вставлять, например высотных отметок. Да ещё в нужной ПСК и плоскости.

В результате пришлось сделать прерывание цикла вставки по ESC, а функция стала очень простой. Запрос:

Точка вставки или ESC для выхода:

Иначе никакой возможности нет.
Ну зачем так категорично - что мешает через grread прорисовывать блок (хоть двухмерный, хоть трехмерный) - по левой кнопке его вставлять (и возращать соответственно ename/vla вставки), а по правой менять (через меню иль еще как) различные параметры (масштаб, угол поворота и пр). По ESC вернуть соответствующий символ (типа nil или 'esc) - для возможности обработки из вне.
Начальные углы и пр. тоже естественно иметь возможность задать.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 20.01.2011, 18:38
#34
swkx


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


ShaggyDoc,

Разумеется, приведённый код подразумевает только "правильное" поведение пользователя. Рассматривалась же принципиальная возможность с помощью (vl-cmdf "_insert" ...) добиться нужного результата.

Кстати, в вышеупомянутой книге в качестве одного из способов предлагается использовать вставку блока в невидимую зону экрана и затем манипуляции с _CHANGE.
Я так и не понял, в чем преимущество этого метода ?
Или он как раз и позволяет отследить все телодвижения пользователя ?
Или этот метод был актуален только в ранних версиях Автокада и сейчас про него можно забыть ?

Просвети, плиз.
swkx вне форума  
 
Непрочитано 20.01.2011, 20:08
#35
Кулик Алексей aka kpblc
Moderator

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


http://forum.dwg.ru/showthread.php?t=11905
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 20.01.2011, 20:44
#36
swkx


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


Всё равно не дошло

Алексей,
поскольку ты в своей функции тоже используешь связку vla-insertblock + _change, ответь, плиз, одним предложением - чем она лучше _INSERT ???
swkx вне форума  
 
Непрочитано 20.01.2011, 21:23
#37
Кулик Алексей aka kpblc
Moderator

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


swkx, _.change работает только в плоскости, без вариантов. А вот _.insert позволяет вставить блок в любую точку, в том числе и лежащую на Z<>0.
Мне ShaggyDoc весьма доходчиво все в свое время объяснил
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 20.01.2011, 21:34
#38
swkx


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


Так почему же она всё-таки используется ?!

Потихоньку начинаю чувствовать себя немножко дебилом
Прямо заговор какой-то...
swkx вне форума  
 
Непрочитано 20.01.2011, 21:44
#39
Кулик Алексей aka kpblc
Moderator

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


Она использовалась, поскольку мне для моих задач практически никогда не требовалась вставка блока с Z<>0. А так-то по идее надо использовать именно _.-insert...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 20.01.2011, 21:52
#40
swkx


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


Если ShaggyDoc тоже выскажется и ответит то же самое, то я буду считать, что день прожил не зря
swkx вне форума  
 
Непрочитано 20.01.2011, 22:05
#41
ShaggyDoc

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


Цитата:
Сообщение от swkx Посмотреть сообщение
ShaggyDoc,

Разумеется, приведённый код подразумевает только "правильное" поведение пользователя. Рассматривалась же принципиальная возможность с помощью (vl-cmdf "_insert" ...) добиться нужного результата.

Кстати, в вышеупомянутой книге в качестве одного из способов предлагается использовать вставку блока в невидимую зону экрана и затем манипуляции с _CHANGE.
Я так и не понял, в чем преимущество этого метода ?
Или он как раз и позволяет отследить все телодвижения пользователя ?
Или этот метод был актуален только в ранних версиях Автокада и сейчас про него можно забыть ?
Разумеется, с vl-cmdf, которая в отличие от command возвращает результат, цикл можно организовать.

Раньше vl-cmdf не было, приходилось извращаться. С CHANGE нет никакого преимущества, это была вынужденная мера. Не было так же замечательного семейства vl-catch

Цитата:
Ну зачем так категорично - что мешает через grread прорисовывать блок (хоть двухмерный, хоть трехмерный) - по левой кнопке его вставлять (и возращать соответственно ename/vla вставки), а по правой менять (через меню иль еще как) различные параметры (масштаб, угол поворота и пр). По ESC вернуть соответствующий символ (типа nil или 'esc) - для возможности обработки из вне.
Да дурь только наша мешает. Все попроще хотим. По крестьянски. Ну, попробуй сам сделать. Прорисовать через grread реальный блок. Можно с лямбдами и без переменных.

Цитата:
Если ShaggyDoc тоже выскажется и ответит то же самое, то я буду считать, что день прожил не зря
Так я в #26 уже писал - команды работают в текущей ПСК. Это делает их универсальными, в этом их преимущество. Когда не работали в 3D, это было не столь заметно и "командными" методами стали брезговать. Объектные методы, наоборот, требуют точек в МСК.

PS. Кстати, блоки и с отрицательными масштабами и с неравными могут быть.

Последний раз редактировалось ShaggyDoc, 20.01.2011 в 22:16.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 20.01.2011, 22:12
#42
swkx


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


Большое человеческое спасибо! Не шучу.


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Все попроще хотим.
Разумеется, и это правильно!
swkx вне форума  
 
Непрочитано 20.01.2011, 22:28
#43
Кулик Алексей aka kpblc
Moderator

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


Цитирую:
Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
>Кулик Алексей aka kpblc

Все эти функции вполне нормальные. Но есть "нюансы, значить".

1. 3D и произвольная ПСК обязательны для мультивставки. Проверь, это не больно.

2. Впреди BricsCAD. Что там и как с объектами - не исследовано. Судя по глюкам в самом Автокаде, там будет не лучше.

3. DBX хорош, если есть он. А если нет (Brics со товарищи), то стратегическая функция выпадает.<...>
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 20.01.2011, 22:38
#44
swkx


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


Другими словами:

«Товарищи, для вставки блоков пользуйтесь командой _INSERT, предназначенной для вставки блоков, герметично упакованной в обёртку из VL-CATH !»
swkx вне форума  
 
Непрочитано 21.01.2011, 06:29
#45
ShaggyDoc

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


Цитата:
Сообщение от swkx Посмотреть сообщение
Другими словами:

«Товарищи, для вставки блоков пользуйтесь командой _INSERT, предназначенной для вставки блоков, герметично упакованной в обёртку из VL-CATH !»
Не совсем так.

Во-первых, тут не все "товарищи". Всякие тута ходют.

Во-вторых, команду надо использовать при интерактивной вставке блоков. Если блоки вставляются программно, без запроса пользовательского ввода, лучше использовать объектный метод vla-insertblock. Разумеется, правильно его используя, т.е. передавая координаты в МСК, а угол поворота в радианах. Объектный метод работает намного быстрее, а программно часто вставляются сразу много блоков - какая-нибудь "штриховка" блоками или разбивка трассы.

Обертка из vl-catch никогда не повредит, но надо избегать её вложенности. Достигается это тем, что она используется в низкоуровневых функциях (вставки блока, любого get-ввода), но очень ограниченно - на уровне программы. Если критичные места защищены, то в программе особо и защищать нечего.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 21.01.2011, 08:40
#46
swkx


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


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Во-вторых, команду надо использовать при интерактивной вставке блоков
Да, конечно, я в данной теме подразумевал исключительно интерактивную вставку.
Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Во-первых, тут не все "товарищи"...
Ну, это ты зря Этом форум (в отличие от SQL.RU, например) отличается исключительной корректностью участников. Пожалуй, могу только одного кадра припомнить, который был крайне удивлён обилием весьма ценных и при этом совершенно бесплатных советов.

Последний раз редактировалось swkx, 21.01.2011 в 08:45.
swkx вне форума  
 
Непрочитано 21.01.2011, 09:51
#47
ShaggyDoc

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


Цитата:
отличается исключительной корректностью участников
А я не про корректность. Может, тут "судари" есть или "господа". "Панове" заходят.

Я лично предпочитаю - "коллеги" для подобных форумов. Но это шутка была.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 21.01.2011, 10:05
#48
swkx


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


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
А я не про корректность.
Да я понял, но если "судари", "господа" и "панове" не требуют к себе именно такого обращения, значит, они нам "товарищи" ! В буквальном понимании
swkx вне форума  
 
Непрочитано 21.01.2011, 10:13
#49
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 6,013


тут еще и "собутыльники" есть
Nike вне форума  
 
Автор темы   Непрочитано 21.01.2011, 10:17
#50
swkx


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


Цитата:
Сообщение от Nike Посмотреть сообщение
тут еще и "собутыльники" есть
Это даже не обсуждается! "Друзей" не трогать !!
swkx вне форума  
 
Непрочитано 21.01.2011, 11:38
#51
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Ну, попробуй сам сделать. Прорисовать через grread реальный блок. Можно с лямбдами и без переменных.
Прошу Вас не давите на больное (лямбды) - это по второй части вопроса, по первой - так пойдет:
Код:
[Выделить все]
(vl-load-com)
(defun my-insert (name)
  ((lambda (f-rec doc)(f-rec name))
   (lambda (name)
     ((lambda (x)
        (vla-endundomark doc)
        (if x
            (f-rec name)
            "Это штатный выход - можно сделать и не по ESC"))
      (progn
       (vla-startundomark doc)
       (vis-ins-bl name 1 1 1 0))))
   (vla-get-activedocument(vlax-get-acad-object))))
  
(defun vis-ins-bl (name x y z ang)
  ((lambda (get-m make-ref model f-rec) (f-rec (get-m) x y z ang 'move))
   (lambda () (vl-catch-all-apply 'grread '(T 8)))
   (lambda (pt-or x y z ang)
     (vla-insertblock model
        (vlax-3d-point ((lambda (pt)
                         ((lambda (os-pt)
                           (if os-pt (trans os-pt 1 0) pt))
                         (osnap pt-or "_end,_mid"))); вот здесь по идее должна формироватся строка на основании привязок - лень искать формат и перемнные - пока забил просто, но суть ясна
                       (trans pt-or 1 0 T)))
                       name x y z ang))
   (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
   (lambda (key x y z ang action)
     (if (vl-catch-all-error-p key) 
         nil;exit
         (if (and (not (listp (cadr key)))
                  (not (= (car key) 25)))
             (f-rec (get-m) x y z ang action); здесь можно добавить обработку данных с клавиатуры
             (if (= (car key) 5)
                 ((lambda (obj newkey)
                    (vla-delete obj)
                    (cond ((vl-catch-all-error-p newkey) nil);exit
                          ((= action 'move)
                           (f-rec newkey x y z ang action))
                          ((= action 'scale)
                           ((lambda (sc)
                              (f-rec newkey (* x sc) (* y sc) (* z sc) ang action))
                            (if (listp (cadr newkey))
                                (if (> (caadr key)
                                       (caadr newkey))
                                    1.1
                                    0.99)
                                1)))
                          ((= action 'rotate)
                           (f-rec (cons (car newkey) (cdr key))
                                  x y z
                                  (if (listp (cadr newkey)) (angle (cadr key) (cadr newkey)) ang)
                                  action))))
                  (make-ref (cadr key) x y z ang)
                  (get-m))
                 (if (= (car key) 3)
                     (make-ref (cadr key) x y z ang)
                     (f-rec (get-m) x y z ang (cdr (assoc action '((move . scale); здесь можно приукрасить меню, сделать изменение орбиты, привязок и всего прочего
                                                                   (scale . rotate)
                                                                   (rotate . move))))))))))))
Про добавление "красивостей" - коментарии в коде. Управление esc - выход (штатный), левая кнопка - вставить блок, правая переключение на изменение размера и угла поворота.
p.s. - сейчас исправил небольшую ошибку (добавил еще 1 trans для правильной привязки видов).
Вложения
Тип файла: rar пример.rar (107.3 Кб, 123 просмотров)
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 21.01.2011 в 12:41.
Дима_ вне форума  
 
Автор темы   Непрочитано 21.01.2011, 12:25
#52
swkx


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


Дима_,
Вполне красиво, но для меня сложно и непонятно
Раз тема не закрылась, решил выложить простой пример, который и побудил её создать:

Код:
[Выделить все]
; Вызов: (test-insblock-multi)
; В текущем чертеже должны быть определены блоки "blok1", "blok2"

(defun test-insblock-multi ()

(setvar "CMDECHO" 0)

(setq filenamedia "dia.dcl"
	  glob-multiinsOK "0"
	  glob-optionOK "0"
	  glob-blokname ""
	  dlg_res 1)

(makedialog filenamedia "Test insblock")

(while (= dlg_res 1)
	(loaddialog filenamedia)
	(if (tblsearch "BLOCK" glob-blokname)
		(cond
			((and (= glob-optionOK "0") (= glob-multiinsOK "0"))

				(if (= dlg_res 1)
				 	(progn
						(princ "\nТочка вставки:")
						(vl-cmdf "_insert" glob-blokname)
					 	(if (vl-cmdf pause)
							(progn
								(vl-cmdf "1" "1")
								(princ "\nУгол поворота:")
								(vl-cmdf pause)
							 	(princ "\n")
							)
						); if
					); progn
				); if

			)

			((and (= glob-optionOK "0") (= glob-multiinsOK "1"))

				(if (= dlg_res 1)
					(progn
						(princ "\nТочка вставки (ESC - прервать):")
						(while
							(vl-cmdf "_insert" glob-blokname pause 1 1 pause)
						)
					); progn
				); if

			)
			
			((= glob-optionOK "1")

				(setq dlg_res 2)

			 	(vl-cmdf "_insert" glob-blokname '(0 0) 1 1 0)
			 	(vl-cmdf "_erase" (entlast) "")
			 	(initdia)
			 	(vl-cmdf "_insert")

			)
		); cond
		(alert (strcat "Блок " glob-blokname " не найден"))
	)
); while

(unload_dialog dcl_id)	

)

(defun loaddialog (filenamedia / )

	(if (< (setq dcl_id (load_dialog filenamedia)) 0) (exit))
	(if (not (new_dialog "dia" dcl_id)) (exit))

	(setq lst (list
				  (list "Блок №1" "blok1")
				  (list "Блок №2" "blok2")
				  (list "Блок №3" "blok3")
			  )
	)

	(start_list "s1")
	(foreach el lst
		(add_list (car el))
	)
	(end_list)
	
	(action_tile "s1"
		(strcat
			"(setq glob-blokname (cadr (nth (atoi $value) lst)))"
			"(set_tile \"descr\" glob-blokname)"
			"(mode_tile \"accept\" 0)"
		)
	)	

	(action_tile "multiins"	
		(strcat
			"(set_tile \"option\" \"0\")"
			"(setq glob-optionOK \"0\")"
			"(setq glob-multiinsOK $value)"
		)
	)

	(action_tile "option"	
		(strcat
			"(set_tile \"multiins\" \"0\")"
			"(setq glob-multiinsOK \"0\")"
			"(setq glob-optionOK $value)"
		)
	)
	
	(action_tile "accept" "(done_dialog 1)")
	(mode_tile "accept" 1)
	
	(action_tile "cancel" "(done_dialog 0)")
	
	(setq dlg_res (start_dialog))

); defun loaddialog

(defun makedialog (filenamedia diacaption /  )
	
	(setq fo (open filenamedia "w"))
		(princ (strcat "dia : dialog { label=\"" diacaption "\";" "\n") fo)

		(princ (strcat ":list_box {key=\"s1\";height=10;width=10;}" "\n") fo)
		(princ (strcat ":edit_box {key=\"descr\";}" "\n") fo)
		(princ (strcat "spacer_1;" "\n") fo)
		(princ (strcat ":toggle { label = \"Мультивставка\"; key = \"multiins\"; value=\"0\";}" "\n") fo)
		(princ (strcat ":toggle { label = \"Задавать все опции\"; key = \"option\"; value=\"0\";}" "\n") fo)
		(princ (strcat "spacer_1;" "\n") fo)
		(princ (strcat "ok_cancel;" "\n") fo)

		(princ (strcat "}" "\n") fo)
	(close fo)  
	
); end defun
Собственно, у меня не получилось добиться повторного вызова стартового диалогового окна при включенной опции "Задавать все опции"
Вложения
Тип файла: dwg
DWG 2007
bloki1.dwg (71.6 Кб, 975 просмотров)
swkx вне форума  
 
Непрочитано 21.01.2011, 12:47
#53
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от swkx Посмотреть сообщение
Вполне красиво, но для меня сложно и непонятно
Когда я впервые увидел лиспы Крыса - у меня сложилось примерно такое-же впечатление - а сейчас ничего - читаю.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 21.01.2011 в 12:52.
Дима_ вне форума  
 
Непрочитано 21.01.2011, 13:13
#54
Лиспер


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


Дима_, а если вставка блока производится в листе? И вот еще - попробуй (скажу честно, твой код я не разобрал - знаний мало) сначала повесить блок на курсор, а потом уже запрашивать углы поворота, масштабы и т.п.
И вот еще. Насколько я понял, ты постоянно вставляешь блок - удаляешь блок. Это по меньшей мере опасно: каждое вхождение блока получает уникальный хэндл, количество которых, конечно, велико, но не бесконечно.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 21.01.2011, 13:24
#55
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от Лиспер Посмотреть сообщение
Дима_, а если вставка блока производится в листе? И вот еще - попробуй (скажу честно, твой код я не разобрал - знаний мало) сначала повесить блок на курсор, а потом уже запрашивать углы поворота, масштабы и т.п.
И вот еще. Насколько я понял, ты постоянно вставляешь блок - удаляешь блок. Это по меньшей мере опасно: каждое вхождение блока получает уникальный хэндл, количество которых, конечно, велико, но не бесконечно.
1. Надо брать активное пространство и "впендюривать" его в место там где определяется модель (ну поленился я).
2. (повесить блок на курсор...) - непонял какие углы - блок всегда на курсоре - щелкаешь правой кнопкой мыши - он маштабируются, еще раз - крутится, далее - по кругу.
3. Ну можно и таскать - тут рекурсия более 20 тыс не даст нарисовать - вылетит по переполнению стека (по моим прикидкам это около 30 минут с учетом что каждую секунду user как автомат калашникова делает десять "дерганий") - "Не выдоишь за день - устанет рука (с)".
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 21.01.2011, 13:33
#56
Лиспер


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


Дима_, а где это видно, что для масштабирования надо выполнить правый клик? И потом, масштабирование как-то странно производится (ИМХО): непонятно от какой точки отсчиыватется коэффициент; нет (пока нет) возможности ввести точное значение коэффициента. Я не могу снять и предоставить видео, но сам попробуй протестировать свою функцию.
Цитата:
Сообщение от Дима_ Посмотреть сообщение
рекурсия более 20 тыс не даст нарисовать - вылетит по переполнению стека
Вопрос не в переполнении стека, кстати, а в переполнении счетчика хэндлов. Как только AutoCAD пересекает эту границу, поведение файла становится труднопредсказуемым: может создать блок, но не даст его вставить. Или полилнию не отрисует (причем часть сделает, а часть откажется напрочь). Не, лекарство, конечно есть - _.wblock, но поди объясни это всем и каждому...
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 21.01.2011, 13:46
#57
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от Лиспер Посмотреть сообщение
Вопрос не в переполнении стека, кстати, а в переполнении счетчика хэндлов.
Я же говорю - их больше чем 20 тыс не будет (а если с практической стороны смотреть - то в разы меньше). Я - там где это возможно и не очень ресурсоемко - предпочитаю "пересоздавать" объекты - а вдуг мы захотим их еще как-то изменять? Привычка это из-за "частенькой" разработки программ для создания чего-либо параметрического - изменились параметры - надо (реакторами или еще как) изменить и объект - если делать редактиование существующего - то как минимум надо писать дополнительную процедуру+ учитывать что там уже "наменяно" до того - разрастется она до безобразия - проще запомнить что создал - старое стереть новое создать - или не миновать ошибок. Допустим создается ящик - есть параметр масштаб - ты его изменил (сделал меньше на 10 процентов), а чтоб сделать обратно - уже надо не на 10 процентов увеличивать т.к. 100-10% = 90, а 90+10%=99 - и это только с одной деталью и одним параметром, а если их много...
P.S. в данном виде можно таскать 1 объект - без проблем, программа демонстрационная (принципиальной возможности сделать - надобавлять, можно чего угодно).

Цитата:
нет (пока нет) возможности ввести точное значение коэффициента.
в коментариях к программе - написал про меню и где что можно переделать по своему. Сейчас для масштабирования - мышь влево - увеличение, вправо - уменьшение - можно сделать по иному - надо только понять как и не поленится это сделать.
p.p.s. я не спорю что лучше сделать меню, ввод данных и пр. - просто не нужна мне она пока (да видимо не только мне) - а время попросту тратить не хочется - вся суть вышесделанного - есть прекрасный способ вставки методом _insert, но его не поменять и т.к. он командный - не везде применим - я лишь показываю что аналогичный вполне реально создать+добавить в "интерактивную" часть свой функционал.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 21.01.2011 в 15:11.
Дима_ вне форума  
 
Автор темы   Непрочитано 21.01.2011, 16:47
#58
swkx


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


Попробую ещё раз озвучить проблему: пост #52
swkx вне форума  
 
Непрочитано 21.01.2011, 16:59
#59
Лиспер


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


Я бы подумывал об использовании временного выхода из диалога. Вполне реализуемо.
Единственное "но": я бы заменил, наверное, первую функцию на
Код:
[Выделить все]
 (defun test-insblock-multi ()

  (setvar "CMDECHO" 0)

  (setq filenamedia "dia.dcl"
        glob-multiinsok "0"
        glob-optionok "0"
        glob-blokname ""
        dlg_res 1
        ) ;_ end of setq

  (makedialog filenamedia "Test insblock")

  (while (= dlg_res 1)
    (loaddialog filenamedia)
    (if (tblsearch "BLOCK" glob-blokname)
      (cond
        ((and (= glob-optionok "0") (= glob-multiinsok "0"))

         (if (= dlg_res 1)
           (progn
             (princ "\nТочка вставки:")
             (vl-cmdf "_insert" glob-blokname)
             (if (vl-cmdf pause)
               (progn
                 (vl-cmdf "1" "1")
                 (princ "\nУгол поворота:")
                 (vl-cmdf pause)
                 (princ "\n")
                 ) ;_ end of progn
               ) ; if
             ) ; progn
           ) ; if

         )

        ((and (= glob-optionok "0") (= glob-multiinsok "1"))

         (if (= dlg_res 1)
           (progn
             (princ "\nТочка вставки (ESC - прервать):")
             (while
               (vl-cmdf "_insert" glob-blokname pause 1 1 pause)
               ) ;_ end of while
             ) ; progn
           ) ; if

         )

        ((= glob-optionok "1")

         (setq dlg_res 2)

         (vl-cmdf "_insert" glob-blokname '(0 0) 1 1 0)
         (vl-cmdf "_erase" (entlast) "")
         (initdia)
         (vl-cmdf "_insert")
         (while (/= (getvar "cmdactive") 0)
           (command pause)
           ) ;_ end of while
         )
        ) ; cond
      (alert (strcat "Блок " glob-blokname " не найден"))
      ) ;_ end of if
    )   ; while

  (unload_dialog dcl_id)

  )
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 21.01.2011, 17:18
#60
swkx


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


Черт возьми, всё просто оказалось.
Лиспер, спасибо!

Цитата:
Сообщение от Лиспер Посмотреть сообщение
Я бы подумывал об использовании временного выхода из диалога.
А вот это я не очень понял. Диалог и так постоянно закрывается и загружается опять. Проясни, плиз.
swkx вне форума  
 
Непрочитано 21.01.2011, 19:44
#61
Лиспер


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


Я просто код не проверял и особо не анализировал. Некогда было...
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 21.01.2011, 19:52
#62
swkx


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


Понятно.
Ну теперь можно и не анализировать, вопрос решился.
swkx вне форума  
 
Непрочитано 24.08.2014, 15:14
#63
AlexCondor

инженер
 
Регистрация: 03.08.2007
Сообщений: 1,418


Прошу помощи у знатоков! Вопрос в принципе по теме.
Раньше пользовался макросом, потом захотелось, чтобы команду можно было быстро повторить по пробелу или Enter'ом, составил код:
Код:
[Выделить все]
 (defun c:insertfile ()
  (setq cmdold (getvar "cmdecho"))
  (command "_.undo" "_begin")
  (setvar "cmdecho" 0)
  (command "_.insert" "~" "\\" "" "" "")
  (command "_.explode" "_last")
  (command "_.purge" "_blocks" "" "n")
  (command "_.undo" "_end")
  (setvar "cmdecho" cmdold)
  (princ)
)
Все работает вроде правильно, но вопрос в тильде. Если нажать Esc при выборе файла, закрывается диалог выбора, но не прерывается вся команда. Как изменить чтобы команда прерывалась полностью.
AlexCondor вне форума  
 
Непрочитано 24.08.2014, 17:08
#64
skkkk


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


AlexCondor, вот так:
Код:
[Выделить все]
 (defun c:insertfile ( / *error* cmdold)
	(defun *error* (msg)   
		(if cmdold (setvar "cmdecho" cmdold))
		(princ msg)
		(princ)
	) ;defun *error*
	(setq cmdold (getvar "cmdecho"))
	(setvar "cmdecho" 0)
	(command "_.undo" "_begin")
	(command "_.-insert" "~")
	(if (> (getvar "CMDACTIVE") 0) 
		(progn
			(command "\\" "" "" "")
			(command "_.explode" "_last")
			(command "_.purge" "_blocks" "" "_n")
		)
		(princ "*Прервано*")
	)
	(command "_.undo" "_end")
	(setvar "cmdecho" cmdold)
	(princ)
)
skkkk вне форума  
 
Непрочитано 24.08.2014, 17:43
#65
AlexCondor

инженер
 
Регистрация: 03.08.2007
Сообщений: 1,418


skkkk,
Спасибо, огромный респект!
AlexCondor вне форума  
 
Непрочитано 24.08.2014, 19:57
#66
ShaggyDoc

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


Цитата:
но вопрос в тильде.
А может вопрос "а зачем так"? Что мы видим - вставляется блок из файла, расчленяется, а потом "пуржатся" блоки. Похоже на внедрение "библиотеки блоков". Это можно сделать проще - в момент встави блока сделать искусственное прерывание. Сам он не вставится, а все определения из файла-блока попадут в чертеж. Фрагмент:
Код:
[Выделить все]
  
(vl-cmdf "_.INSERT" block_file_name) ;; начинаем вставку блока
(vl-cmdf) ;; искусственно прерываем
ShaggyDoc вне форума  
 
Непрочитано 26.08.2014, 10:34
#67
AlexCondor

инженер
 
Регистрация: 03.08.2007
Сообщений: 1,418


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Что мы видим - вставляется блок из файла,
Нет, мне нужно просто найти, выбрать и вставить файл в текущий чертеж, причем не блоком. ESC - если решил сделать иначе. Внедрение библиотеки это уже последствия. Подскажите, как это сделать желательно одной командой, не затрагивая определений блоков.
AlexCondor вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Опять про _INSERT и диалоговое окно выбора опций

Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Опять про перепуск арматуры AlfF1 Железобетонные конструкции 52 14.11.2017 08:55
Опять про сбор нагрузок (сильно не бить, поиск юзал) Gevo Конструкции зданий и сооружений 39 21.04.2009 23:19
И опять про лицензирование Aragorn Разное 39 27.02.2009 15:31
Опять про системные переменные DEL AutoCAD 4 03.11.2006 11:12