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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Использование JOIN в макросе. Подскажите, почему не работает...

Использование JOIN в макросе. Подскажите, почему не работает...

Ответ
Поиск в этой теме
Непрочитано 28.12.2017, 18:16 #1
Использование JOIN в макросе. Подскажите, почему не работает...
Immortal_6666
 
вольный копейщик
 
Регистрация: 03.11.2010
Сообщений: 132

Добрый день.
Требуется создать макрос, который будет последовательно выполнять несколько команд. Если кратко - все что есть в файле перемещает в слой ноль, объединяет все что может командой Соединить (_join), далее очистка файла, регенерация и зум под границы экрана. Макрос планирую повесить на палитру.
Со всеми частями справился кроме _join. Весь мозг сломал уже.

Когда работаю мышкой прокатывает ctrl+a потом join с кнопки - все супер. В макросе так не работает. Как аналог ctrl+a использую _ai_selall

Пробовал другую стратегию - сначала join потом ключ в (все) потом enter - опять же, все работает если команду вызвать самому, но в макросе пишет "неверный выбор. требуется точка или последний".. Видимо, какая-то хитрость есть в этой команде.

Этот кусок макроса записываю так: _join;в;;

Помогите, пожалуйста.

----- добавлено через ~1 ч. -----
Попробовал на LISP (самым примитивным образом) - та же проблема с Join

Код:
[Выделить все]
(defun c:atz ()

(command "_change" "в" "" "с" "с" "0" "")
(command "_join" "в")
(command "_purge" "_a" "*" "_n")
(command "_audit" "_y")
(command "_zoom" "_e" )
(command "_regenall")
(command "_qsave")
) ;_ end of defun
Может модератор эту тему в раздел по программированию перенесет? Я сразу не стал туда писать, тк. не нашел там подраздел по макросам.

Последний раз редактировалось Immortal_6666, 28.12.2017 в 19:28. Причина: исправление
Просмотров: 4930
 
Непрочитано 29.12.2017, 01:01
#2
engngr

сети
 
Регистрация: 03.11.2008
Московия*
Сообщений: 5,766


Команда: _JOIN
Выберите исходный объект: _all
*Неверный выбор*
Требуется точка или Последний

Не видно опции "все". Поэтому только задать две точки так, что бы в них попадало всё, что нужно.
И у вас не макрос. И дикая смесь ру с ен.
engngr вне форума  
 
Автор темы   Непрочитано 29.12.2017, 09:40
#3
Immortal_6666

вольный копейщик
 
Регистрация: 03.11.2010
Сообщений: 132


Если в join ввести какой-нибудь неверный ключ, например "ы", то показывается список того, что можно использовать. И там есть ключ "Все". Попробуйте - ключ "в" работает если с кнопки команду вызывать. См картинку.

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

Изначально у меня был макрос, а то, что на LISP это уже вторая попытка решить задачу. Сути-то не меняет.
Точки он кстати тоже не принимает если координатами задавать. Берет первую и пишет "неверный выбор".

На самом деле на join свет клином не сошелся, можно как-то еще. Но очень уж удобная команда. И всеядная. PEDIT мне гораздо меньше нравится.
Может специалисты по LISP что-нибудь подскажут...
Миниатюры
Нажмите на изображение для увеличения
Название: join.JPG
Просмотров: 27
Размер:	32.2 Кб
ID:	197321  
Immortal_6666 вне форума  
 
Непрочитано 29.12.2017, 12:32
#4
skkkk


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


Разве _JOIN не запрашивает сначала первый (исходный) объект? По крайней мере, в 2011-м точно запрашивает, и там уж никак ему не скормить все, потому что требуется только один.
Я уже лет 10 пользуюсь небольшим лиспиком, найденным тут на форуме: JPL. Изначальный источник найти проблематично, судя по всему, автор лиспа - VVA.
Не уверен насчет полной всеядности, но отрезки, дуги, полилинии объединяет всегда без вопросов, главное, чтобы их концы совпадали. Или в этом лиспике надо выставить требуемую точность вместо нуля. Чтобы это дело заработало в лиспе, надо будет провернуть что-то такое:
Код:
[Выделить все]
;;; создаем набор из всех "линейных" объектов в модели:
(setq ss (ssget "_X" '((0 . "*LINE,ARC")(410 . "Model")))) 
;;; включаем ручки всем объектам из набора:
(sssetfirst nil ss)
;;; запускаем команду JPL:
(C:JPL)
skkkk вне форума  
 
Автор темы   Непрочитано 29.12.2017, 15:15
#5
Immortal_6666

вольный копейщик
 
Регистрация: 03.11.2010
Сообщений: 132


Дело в том, что до 2012 года Join работал через одно место Начиная с 2012-ой версии и далее он работает очень классно: можно сначала выделить все и нажать на команду, или сначала на команду, а потом как я писал выше. Причем, выделять можно вообще все объекты (даже сплайны, что очень удобно) на чертеже - что сможет, все объединит. Но, видимо, у этой команды есть какие-то особенности, которые не позволяют сделать такой же простой способ обращения к ней программно (ручками-то еще раз замечу, все работает на ура)...

Лиспы похожие видел, просто раз уж есть такая команда, почему бы ее в готовом виде не взять. А получается, что не работает... Странно, что до меня никто не пытался реализовать подобный макрос с использованием Join.

skkkk, я тут попутно еще хотел извиниться, что пропал как-то все так закрутилось, что изучение LISP пришлось отложить пока.
Immortal_6666 вне форума  
 
Непрочитано 30.12.2017, 01:08
#6
engngr

сети
 
Регистрация: 03.11.2008
Московия*
Сообщений: 5,766


Цитата:
Сообщение от Immortal_6666 Посмотреть сообщение
Если в join ввести какой-нибудь неверный ключ, например "ы", то показывается список того, что можно использовать. И там есть ключ "Все". Попробуйте - ключ "в" работает если с кнопки команду вызывать. См картинку.
Да, спасибо. У меня оказалась кривая локализация mep 2016 ru. С точкой выдает, как надо.
engngr вне форума  
 
Непрочитано 30.12.2017, 06:58
#7
Setvar


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


Цитата:
Сообщение от engngr Посмотреть сообщение
У меня оказалась кривая локализация mep 2016 ru.
Это странно. По-моему, после AutoCAD 2007 явно кривых локализаций нет. И MEP здесь ни при чем. Опция выбора объектов в команде редактирования использует опции стандартной команды "_SELECT" ("ВЫБРАТЬ"). Точка же перед именем команды (а не перед опцией) заставляет AutoCAD использовать оригинальное имя команды в том случае, если она была переопределена. Да ведь ты знаешь это. Попробуй применить команду "_SELECT" ("ВЫБРАТЬ") с разными опциями.
Кстати, для некоторых пользователей может оказаться загадочными предупреждение типа "Требуется точка или ...". Что еще за точка? Дело в том, что объект можно выбрать не только просто указанием на него прицелом, но и с дополнительным указанием точки на объекте, если при указании объекта использовать объектную привязку типа "_near" ("ближайшая"). В этом случае указанная точка запоминается и ее можно использовать с помощью опции "@" или с помощью переменной "LASTPOINT".
Setvar вне форума  
 
Автор темы   Непрочитано 30.12.2017, 10:07
#8
Immortal_6666

вольный копейщик
 
Регистрация: 03.11.2010
Сообщений: 132


Setvar, а по поводу неработающего через код, но работающего при вызове мышкой Join можете что-то прокомментировать?
Immortal_6666 вне форума  
 
Непрочитано 30.12.2017, 11:09
#9
Setvar


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


Я думаю, что здесь недоработка программистов AutoCAD. При вызове команды "_JOIN" ("СОЕДИНИТЬ") из AutoLisp используется старый вариант команды. Я нарывался на подобную ситуацию с какой-то другой командой, не помню сейчас, с какой именно.
Setvar вне форума  
 
Автор темы   Непрочитано 30.12.2017, 11:44
#10
Immortal_6666

вольный копейщик
 
Регистрация: 03.11.2010
Сообщений: 132


Setvar, жаль, но в любом случае, спасибо. Даже в 2017-й версии эта команда ведет себя плохо.
Я тоже рассматриваю данное поведение как глюк. Просто в виду своей неопытности в автоматизации, думал, что возможно что-то упускаю. Еще через вызов через LISP не работает _ai_selall - пишет "неизвестная команда".
Альтернативные решения какие-то уж больно громоздские, видимо, придется отказаться от идеи с этим макросом/лиспом.

П.С. С лиспом понятно. Но для меня удивительно, что через макрос этот глюк тоже остается, ведь макрос по сути, имитация человеческих действий... Ведь когда руками эту команду вбиваю в кс, все работает.
Immortal_6666 вне форума  
 
Непрочитано 30.12.2017, 13:48
1 | #11
skkkk


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


Проверить возможности нет, может, сработает такая конструкция?
Код:
[Выделить все]
(vla-SendCommand (vla-get-ActiveDocument (vlax-get-acad-object)) "_JOIN _A ")
Полагаю, vl-cmdf и command-s уже были опробованы?
skkkk вне форума  
 
Непрочитано 30.12.2017, 15:25
1 | #12
Setvar


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Полагаю, vl-cmdf и command-s уже были опробованы?
Естественно.
Цитата:
Сообщение от skkkk Посмотреть сообщение
(vla-SendCommand (vla-get-ActiveDocument (vlax-get-acad-object)) "_JOIN _A ")
Это выражение будет работать аналогично штатной команде "_JOIN" ("СОЕДИНИТЬ"), вводимой через командную строку и без запросов в том случае, если после опции _All будет стоять ДВА пробела.
Благодарим skkkk.
Код:
[Выделить все]
(vla-SendCommand (vla-get-ActiveDocument (vlax-get-acad-object)) "_JOIN _All  ")
Замечание к работе команды "JOIN" ("СОЕДИНИТЬ"). Если не будет выбран исходный объект, а сразу будут выбраны ВСЕ объекты, то, например, отрезок с разрывом не объединится в единый отрезок.
Setvar вне форума  
 
Автор темы   Непрочитано 30.12.2017, 20:35
#13
Immortal_6666

вольный копейщик
 
Регистрация: 03.11.2010
Сообщений: 132


skkkk, Setvar, Мужики (прям с большой буквы!), огромное спасибо!!!!

Действительно работает теперь! Для меня это правда какое-то шаманство... особенно, про "два пробела"

Нужные мне операции теперь работают как надо. Хотел добавить в конце операцию "close" после сохранения, но тут что-то пошло не так. Как-то он слишком быстро что ли закрывает - все срабатывает, кроме _join. После открытия файла, там все не соединено, а без close работает... опять какая-то мистика. В лиспах же вроде все последовательно выполняется? Или надо какую-то "задержку" выставлять?

Код:
[Выделить все]
 (defun c:atz ()

(command "_change" "в" "" "с" "с" "0" "")
(vla-SendCommand (vla-get-ActiveDocument (vlax-get-acad-object)) "_JOIN _All  ")
(command "_purge" "_a" "*" "_n")
(command "_zoom" "_e" )
(command "_audit" "_y")
(command "_regenall")
(command "_qsave")
(command "_close")

) ;_ end of defun
UPD. Изучил, что пишет кс - Joint почему-то при таком вызове самым последним обрабатывается, после всех других команд.

Последний раз редактировалось Immortal_6666, 30.12.2017 в 20:50.
Immortal_6666 вне форума  
 
Непрочитано 30.12.2017, 22:37
1 | #14
Setvar


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


Попробуй вот такой код:
Код:
[Выделить все]
(defun c:atz ( / adoc)
(setq adoc (vla-get-ActiveDocument (vlax-get-acad-object)))
(vl-cmdf "_CHPROP" "_all" "" "_la" "0" "")
(vla-SendCommand adoc "_JOIN _All  ") 
(vl-cmdf "_-PURGE" "_a" "*" "_n")
(vl-cmdf "_ZOOM" "_e" )
(vl-cmdf "_AUDIT" "_y")
(vla-SendCommand adoc "_REGENALL ")
(vla-SendCommand adoc "_QSAVE ")
(vla-SendCommand adoc "_CLOSE ")
)
Setvar вне форума  
 
Автор темы   Непрочитано 31.12.2017, 10:44
#15
Immortal_6666

вольный копейщик
 
Регистрация: 03.11.2010
Сообщений: 132


Setvar, спасибо! Теперь Join срабатывает до закрытия. Но все равно после очистки, зума и аудита...

1)Каким-то образом можно его запихнуть сразу после _CHPROP ? Может надо все вызовы заменить на vla-SendCommand?
1.1) Кстати, почему мы здесь vl-load-com в начале не прописываем - это не обязательно?


2) И еще, хочу добавить в CHPROP установку веса, цвета и типа по слою это примерно так будет?

Код:
[Выделить все]
(vl-cmdf "_CHPROP" "_all" "" "_la" "0" "ц" "byLayer" "т" "byLayer" "е" "byLayer" "")
(вроде все работает, но я просто англ. ключи не знаю какие для этих свойств)
UPD. Ключи нагуглил - C, LT, LW. Есть ли где место, где их централизовано можно находить? В справке англоязычной свойства перечислены, но заглавными буквами ключи не отмечены...

Теперь так:

Код:
[Выделить все]
(vl-cmdf "_CHPROP" "_all" "" "_la" "0" "_C" "byLayer" "_LT" "byLayer" "_LW" "byLayer" "_S" "1" "")

Последний раз редактировалось Immortal_6666, 31.12.2017 в 11:02.
Immortal_6666 вне форума  
 
Непрочитано 31.12.2017, 11:02
1 | #16
Setvar


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


Хотел я все команды запустить через vla-SendCommand, но что-то не получается в связи с запросами самих команд. Последний вариант оказался жизнеспособный.
Цитата:
Сообщение от Immortal_6666 Посмотреть сообщение
Но все равно после очистки, зума и аудита...
Так может, это и к лучшему.
Пример записи команды "_CHPROP" ("СВОЙСТВА") с английскими опциями:
Код:
[Выделить все]
(vl-cmdf "_CHPROP" "_all" "" "_la" "0" "_c" "_byLayer" "_lt" "_byLayer" "_lw" "_byLayer" "")
По-моему, начиная с какой-то версии (vl-load-com) загружается автоматически при запуске AutoCAD. Но можно и добавить в код это выражение.
Setvar вне форума  
 
Автор темы   Непрочитано 31.12.2017, 11:08
#17
Immortal_6666

вольный копейщик
 
Регистрация: 03.11.2010
Сообщений: 132


Спасибо!!! Я правда в своем варианте забыл "_" перед bylayer, но и так работало, хотя с "_" наверное каноничнее. Я просто думал, что это именно значение параметра, также как например "red" для цвета и "_" в таком случае не требуется.
С порядком функций, наверное, действительно не так важно в данном случае.

А если пойти еще дальше - заставить этот код обрабатывать содержимое какой-то (указанной мною) папки - это сильно усложнит программу?
Или может что проще ко все открытым в сеансе документам.
Immortal_6666 вне форума  
 
Непрочитано 31.12.2017, 11:21
#18
Setvar


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


Цитата:
Сообщение от Immortal_6666 Посмотреть сообщение
А если пойти еще дальше - заставить этот код обрабатывать содержимое какой-то (указанной мною) папки - это сильно усложнит программу?
Подобные темы были на этом форуме. Сам я не возьмусь за такую задачу.
Setvar вне форума  
 
Автор темы   Непрочитано 31.12.2017, 13:08
#19
Immortal_6666

вольный копейщик
 
Регистрация: 03.11.2010
Сообщений: 132


Такое наверное сложно. Я искал по форуму.

А если к открытым документам? Что-то типа цикла - получить список открытых в сеансе документов, применить к текущему документу функцию lisp, файл закроется (_close в конце кода), соотв. текущим станет другой документ и продолжить, пока число открытых документов не станет равно 0.
Я просто не знаю как это кодом описать, т.к. 0 в lisp и в программировании в целом.
Immortal_6666 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Использование JOIN в макросе. Подскажите, почему не работает...

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажите почему расстояние между сваями должно быть минимум 3 диаметра Shketkol Основания и фундаменты 38 08.12.2021 09:31
Lisp. Почему может не работать entmod. Не работает в 1-м отдельно взятом файле. Kirill_Ja LISP 2 18.07.2013 17:00
Подскажите почему не работает генерация ферм C@DbIK Лира / Лира-САПР 3 23.05.2013 14:20
Почему не работает entdel hydushko Программирование 1 18.04.2013 07:52
Подскажите, пожалуйста, почему у меня "плохо" собираются модальные массы ? 3MEi86 Лира / Лира-САПР 4 18.11.2011 09:40