|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Есть ли переменная содержащая количество листов (layouts)?
ՃԱՐՏԱՐԱԳԵՏ, տ.գ.թ.
Торонто
Регистрация: 23.10.2007
Сообщений: 1,990
|
||
Просмотров: 28269
|
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Переменной нет. Но есть "коллекции" различных объектов. Получить количество объектов, их списки, свойства и прочее можно обратившись к коллекции.
Например, количество Layouts: Код:
Код:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426
|
Да, но в полях, по-моему, невозможно использовать лисповые функции...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
Есть функция vlax-get-property, которой надо передать имя свойства в виде строки. Типа 'Layouts или "Layouts". Наверное его можно и функцией сконструировать, но не пробовал. А "более правильно" потому что для любого языка подходит и более соотносится с концепцией ООП - работать с объектами через их свойства, и не влезать в потроха с помощью функций. Когда Autodesk сделала функции типа vla-get-layouts, это сделали черный ход. Типа, для пролетариата удобней, чем через парадное. Насколько помню, при появлении COM в R14 таких дырок не было. |
|||
![]() |
|
||||
ShaggyDoc,
Поле это field. Нужно чтобы количество листов можно было вставить как field в атрибут или мтекст.
__________________
Блог |
||||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Ах, "ви в ЭТОМ смысле" (С). Виноват, не разглядел, что в исходном вопросе было про "поле".
Я бы не заморачивался с тем, чтобы в единственном месте в штамп автоматически вставлять единственную цифру, если речь о заполнении основной надписи. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426
|
Red Nova, попробуй все же сделать подшивку и с ней поиграться.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426
|
ACAD, а ты ничего не перепутал? Например, с топиком...
P.S. chspace тебе в руки
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер-строитель Регистрация: 15.08.2007
Киров
Сообщений: 2,204
|
Код:
|
|||
![]() |
|
||||
Так понял что в поле засунуть количество листов нереально. Чтож, и так бывает.
__________________
Блог |
||||
![]() |
|
||||
Makswell,
У меня АutoCAD 2009, файла acaddoc.LSP не нашел ![]()
__________________
Блог |
||||
![]() |
|
||||
Регистрация: 14.03.2006
Сообщений: 863
|
Red Nova, здесь посмотрите про эти файлы, второй пост особенно хорош
![]() |
|||
![]() |
|
||||
Спасибо за подсказки. Нашел
Makswell, А Код:
invalid field code
__________________
Блог |
||||
![]() |
|
||||
К сожалению не обновляется если количество листов изменить. regen all не помогает, нужно заново открыть файл и заново вставить поле, чтобы количество листов было заново учтено.
__________________
Блог |
||||
![]() |
|
||||
Инженер-строитель Регистрация: 15.08.2007
Киров
Сообщений: 2,204
|
Да, так и есть, колличество изменится только при следующем открытии файла.
Поле заново вставлять не нужно. ЗЫ Опять по той же ссыке, можно сделать кнопку, принудительно изменяющую поле с количеством листов. Код:
|
|||
![]() |
|
||||
Инженер Регистрация: 02.10.2008
С-Пб
Сообщений: 3,692
|
В свойствах чертежа можно какое-либо из них (в смысле, свойств - "Ключевые слова" там и т.д.) отвести под количество листов (или новое создать на вкладке "Прочие", если основные свойства уже используются) Ну и в штампах - таблицах использовать field со ссылкой на это свойство.
Конечно, при изменении кол-ва листов придется значение это ручками менять, но всего в одном месте. А может, и программно можно - отследить события удаления-добавления листов... |
|||
![]() |
|
||||
Регистрация: 29.05.2007
Сообщений: 210
|
|
|||
![]() |
|
||||
Инженер-строитель Регистрация: 15.08.2007
Киров
Сообщений: 2,204
|
Без лиспа всё равно никак. В том выражении в поле вставляется значение переменной USERI1, которая заполняется всё равно программно.
PS Всё таки, если не секрет, какоё прикладное значение имеет количество вкладок листа? Подшивку никто не пытался использовать? |
|||
![]() |
|
||||
Регистрация: 28.01.2009
Сообщений: 14
|
Да прикладное значение элементарное - Сделал штамп динамическим блоком - рамка меняет форматы, сбоку выбираешь есть/нет штампик СОГЛАСОВАНО, поля штампа заполняются сами...ну вобщем все дела, И завис на счетчике листов. Хочу чтобы два этих пункта заполнялись сами - чтобы один атрибут считал сколько листов в чертеже, а другой выводил номер листа на котором находится.
И эту рамку вставляю на все листы, чем с себя снимаю постоянные гемор с проверкой - Все ли штампики заполнил? Переделал ли нумерацию в поле - Лист/Листов при перемещении/создании нового листа и т.д А через подшивку не делаю потому как пока не внедрил еще ее в работу, но уже движусь по этому направлению (на нее у меня грандиозные планы) Да и с расстановкой нумерации листов в каждом отдельно взятом альбоме подшивки мне она врятли поможет... Насколько я понял из своих экспериментов с ней, с ее помощью я смогу посчитать только количество листов во ВСЕЙ подшивке. А не хочу Лспом потому что тогда каждому из мох коллег придется ставить это лисп, объяснять че к чему...ну и т.д... Помоему было бы проще и функциональнее (со всех сторон) сделать это в виде некого атрибута... |
|||
![]() |
|
||||
Инженер-строитель Регистрация: 15.08.2007
Киров
Сообщений: 2,204
|
Вопросы:
1. Я так понял весь проект в одном файле. Не тормозит? Хотя нет, лучше так: какой объём файла? Для примера посмотрел 1-й попавшийся проект у себя: 10-этажный жилой дом, альбом АС - 20 файлов *.dwg общим объемом 11Mb. Если всё это запихнуть в один файл, то можно предположить, что он будет весить не менее 10Mb. Мой комп пока такое вряд ли потянет. 2. Как заполняютя твои штампы? Конкретно, если например меняется шифр проекта или стадия, в скольких местах надо изменить, чтобы поменялось во всём проекте? С вопросами пока всё, теперь сентенции. 1. Ничто не заменит автоматически создаваемую и в последствии автоматически изменяющуюся в подшивке ведомость листов, которую можно вставить в виде таблицы в рисунок. Даже лисповых аналогов, достойных сего чуда я не встречал. 2. В подшивке все данные штампа, кроме названия и номера листа можно прописать в одном месте. 3. Справедливости ради надо отметить, что в пошивке всё таки нет поля для количества листов. Но ничто не мешает сделать доп. свойство подшивки "кол-во листов" и полем ссылаться на него. Не автоматически, но всё равно достаточно быстро. 4. И ещё справедливовсти ради надо отметить, что многострочные атрибуты в блоке, использующие поля подшивки (как показала статистика - именно подшивки!) иногда глючат. Об этом я уже упоминал в другой теме. |
|||
![]() |
|
||||
Регистрация: 28.01.2009
Сообщений: 14
|
Ну у меня гдето 4-6Mb не тормозит вроде ниче...
Меняются путем ввода данных в Свойствах чертежа. (создал пару пользовательских свойств, ну и соответственно там у меня все данные штампа. Один раз ввел, на всех листах поставилось.) Да. Поле - Номер листа есть, но опятьже номер листа относительно ВСЕХ листов в подшивке (надо глянуть может возможно сделать номер листа определенной группы) Ну и взаключение подмогните Нармальным стопроцентов работающим лиспом(я о щетчике) посажу его на кнопочку и буду нажимать...Раз другого выхода нет... |
|||
![]() |
|
||||
Инженер-строитель Регистрация: 15.08.2007
Киров
Сообщений: 2,204
|
Ну раз всё в одном файле, так сделай пользовательское свойство в _DWGPROPS "кол-во_листов" и в штампе поле со ссылкой на него. Тоже самое получится: "Один раз ввел, на всех листах поставилось".
Насчёт "нармального" лиспа, чем лисп (setvar "USERI1" (length(layoutlist))) вкупе с полем %<\AcVar USERI1>% не устраивает? PS Мне бы такой комп как у тебя. У меня 4-6Mb всё же подтормаживает. Даже завидно. |
|||
![]() |
|
||||
Регистрация: 28.01.2009
Сообщений: 14
|
Лисп, кстати говоря, при ближайшем рассмотрении меня вполне устроил!
Только растолкуйте мне что за переменная USERI1? Как я понял используется она для хранения какихто устанавливаемых пользователем значений? Ну типа записной книжки...Я прав? Или я не верно понял? |
|||
![]() |
|
||||
Инженер-строитель Регистрация: 15.08.2007
Киров
Сообщений: 2,204
|
Цитата:
В подшивке это можно реально сделать. И ещё ведомость чертежей создать. Для твоего варианта не вижу ничего лучшего, как проставлять номер листа вручную. Хотя если листы расположены последовательно, то можно в принципе написать лисп. Цитата:
Функция length считает количество элементов в списке. |
|||
![]() |
|
||||
Регистрация: 03.03.2005
Сообщений: 3
|
Вариант решения есть и при этом довольно таки простой и изящный на мой взгляд - написать код обработчиков событий, скомпилировать это в dll-сборку и подключить к автокаду. Что я и сделал.
Только сразу предупреждаю - писал я это под 2009-й автокад. Тестировал в нем же. У меня всё замечательно работает. Протестировать на другом акаде/компе нет возможности. Кроме того, на компе должен быть установлен .Net Framework 3.5 SP1 (если он у вас не установлен, то скачать его можно абсолютно бесплатно с официального сайта Майкрософт отсюда В общем вот выкладываю архив, в нем лежит readme.txt о том как правильно установить (всё до безобразия просто). Любопытно услышать замечания/пожелания.
__________________
С уважением Андрей. |
|||
![]() |
|
||||
Регистрация: 28.01.2009
Сообщений: 14
|
compositum
Чет не получается... Да я думаю вышепредложенное вполне приемлемое решение. Еще сценарий на выполнения макроса написать и все. А на счет атрибута - ЛИСТ у тебя никаких идей нет? Последний раз редактировалось alexxandr, 30.01.2009 в 15:09. |
|||
![]() |
|
||||
AutoCAD/AutoLISP Регистрация: 27.08.2003
Seattle/USA
Сообщений: 1,133
|
Переменная "CTAB", если ее вставить в FIELD то с прерменой лайоута она будет менятся. Кроме того если сделать лисп то его тоже можно загнать в FIELD начиная с 2008 акада.
![]()
__________________
Сквозь тернии к звездам.... и обратно :yes: |
|||
![]() |
|
||||
Цитата:
У меня голова под вечер не варит или это то, о чем я думаю?
__________________
14 Ибо если вы будете прощать людям согрешения их, то простит и вам Отец ваш Небесный (Мф 6, 14) |
||||
![]() |
|
||||
Регистрация: 07.07.2010
Сообщений: 17
|
Такая переменная должна быть! Откуда он берёт эти цифры? [IMG]http://s53.***********/i139/1007/83/eadb966464f1.jpg[/IMG]. Вот только как её (переменную) найти...
|
|||
![]() |
|
||||
Регистрация: 21.10.2012
Сообщений: 144
|
Здравствуйте.
Тоже интересно, как можно с помощью поля отобразить "номер листа" и "количество листов". Может, появилась или стала известна системная переменная, или у кого-то есть наработки? Желательно, без лиспа, точнее, чтобы не вносить изменения в файлы автокада и без внешних подключаемых лисп-файлов. Тут писали про возможность вставки лиспа в филд, как это реализовать? Спасибо. |
|||
![]() |
|
||||
Регистрация: 17.07.2008
Сообщений: 75
|
Тут смотрели?
|
|||
![]() |
|
||||
Регистрация: 21.10.2012
Сообщений: 144
|
Walkmax, спасибо.
Предложенный вами вариант очень хорош по функционалу, особенно благодаря автоматическому обновлению, но он опять требует внесения изменений в файлы автокада или в реестр, но мне это не совсем удобно, так как, если правильно понимаю, открытый на другом компе автокадовский файл уже не будет обладать корректно работающим счетчиком. Всё же надеялся, что есть что-то встроенное и доступное по умолчанию хотя бы последним версиям автокада. |
|||
![]() |
|
||||
начинающий инженер-гидротехник Регистрация: 18.04.2010
Санкт-Петербург
Сообщений: 910
|
попадалось такое решение, кажется от VVA и wetr:
1. (setvar "USERI1" (length(layoutlist))) - системной переменной user1 задается значение (length(layoutlist)) 2. В поле прописывается dieselexpression $(-,$(getvar,USERI1),0) http://forum.dwg.ru/showthread.php?t=14548 - здесь подробнее всё описано Последний раз редактировалось kacugu, 08.02.2016 в 13:05. Причина: неправильно понял вопрос |
|||
![]() |
|
||||
Регистрация: 12.03.2013
Сообщений: 611
|
Интересно, но для меня например было бы достаточно просто чтоб обновлялось кол-во листов в файле в этом поле %<\AcVar USERI1>%
Как я понял стандартная переменная в акад отсутствует и поэтому это можно только реализовать на той машине где произведены необходимые манипуляции, написан код, подгружена библиотека и т.п. Ну раз уж так то для себя сделал след образом - стандартную команду регенерировать все ВСЕРЕГЕН превратил в макросик, т.е. дополнил ее всем уже известной тут строчкой ^C^C(setvar "USERI1" (length(layoutlist)));_updatefield;_all;; В результате у меня на кнопке ВСЕРЕГЕН прописано так ^C^C_regenall ^C^C(setvar "USERI1" (length(layoutlist)));_updatefield;_all;; Т.е. что получили При открытии файла конечно не обновляется это поле, но обновляется при выполнении команды регенерировать все Но может, кто нить подскажет как без подгрузки библиотек допилить такую простую схему чтоб и при открытии файла обновлялось? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426
|
allar8, fieldeval поменяй на 31 (подробнее в справке)
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 12.03.2013
Сообщений: 611
|
Да в 31 и стоит у меня. Да и это не совсем, то.
У меня не речь не про обновление полей, а про обновление конкретного поля, под обновлением которого подразумевается загон в переменную USERI1 кол-ва листов в документе и отображение значение этой переменной в поле Т.е. по сути все как бы просто при открытии файла мне надо чтоб запустился макрос на моей кнопке ^C^C_regenall ^C^C(setvar "USERI1" (length(layoutlist)));_updatefield;_all;; Последний раз редактировалось allar8, 03.07.2019 в 11:11. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426
|
Поменяй acaddoc.lsp или acad.mnl
![]() Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426
|
Да, только проверь корректность кода. Может быть, будет иметь смысл заменить на
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 12.03.2013
Сообщений: 611
|
Цитата:
----- добавлено через ~16 мин. ----- Цитата:
Сведем в одно сообщение рабочее решение теперь. Создаем поле %<\AcVar USERI1>% Стандартную команду регенерировать все ВСЕРЕГЕН превращаем в макросик, т.е. дополняем ее всем уже известной тут строчкой ^C^C(setvar "USERI1" (length(layoutlist)));_updatefield;_all;; В результате получаем кнопку ВСЕРЕГЕН с макросом ^C^C_regenall ^C^C(setvar "USERI1" (length(layoutlist)));_updatefield;_all;; Т.е. что получили при выполнении регенерировать все ВСЕРЕГЕН - это поле (%<\AcVar USERI1>%) обновляется, но при открытии файла обновления не происходит. А с помощью Кулика Алексея удалось и при открытии файла выполнить обновление этого поля см. #50 У меня из #50 зарабатало с файлом acad.mnl В конце файла acad.mnl прописал, рекомендуемые Куликом Алексеем строчки: (setvar "useri1" (length (layoutlist))) (vl-cmdf "_.updatefield" "_all" "") Мелоч казалось бы - обновляемое поле с кол-вом лайотов, а приятно))) Последний раз редактировалось allar8, 03.07.2019 в 13:26. |
|||
![]() |
|
||||
Регистрация: 12.03.2013
Сообщений: 611
|
Вопрос всем Гуру программирования. Позскажите плиз, направьте так скать в нужное русло. Нужно создать поле со значением с зависимым от кол-ва лайотов в чертеже.
Т.е. конкретно нуно чтоб поле выдавало значение "0" если число кол-ва лайотов двузначное, т.е. больше 9. и значение "00" если число кол-ва лайотов однозначное, т.е. меньше 10 Нужно еното мне чтоб в шифре у меня автоматически менялась концовка шифра типа - 001, 002... 010,011 и.т.д. где 1,2...10 число лайотов - с этим нет проблем. Проблема с автовыбором кол-ва нулей перед значение кол-ва листов Зачем мне это не спрашивайте - такие правила оформления в нашей конторе. В шифре документа такое должно быть окончание. И вообще такое реально сделать? Если да - подскажите с помощью каких средств и как Заранее благодарен. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Ничего не понял, но в .Net это решается так, например)
----- добавлено через ~31 мин. ----- А вообще то ГОСТ Р 21.1101 еще не отменили: Цитата:
|
|||
![]() |
|
||||
Регистрация: 12.03.2013
Сообщений: 611
|
Я же говорил - не спрашивайте зачем))). Спорить с местными правилами я не вправе. Приходится подстраиваться. Тем более руководство и НК в другом городе). Я просто проектировщик а не законадатель мод в конторе. Подскажите лучше по теме вопроса, чем рассуждать о том что по Гост или нет)))
|
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Так уже подсказал
С такими загонами руководства просто заполнял программно бы блоки основных надписей без всяких полей. А программно можно любой маразм реализовать, если он укладывается в алгоритмизацию) Можно еще попробовать DIESEL, но с ним толком и не работал. |
|||
![]() |
|
||||
Регистрация: 12.03.2013
Сообщений: 611
|
как раз на него и обращал внимание - но блин не обновляет(
----- добавлено через ~1 мин. ----- Я не один работаю - всех тоже не способен переучить - есть особенности. В обчем мине нуно так. Про маразм не спорю. Есть у всех это НК). Да ладно бы конторка была маленькая - можно поспорил бы еще с НК). Компания всероссийская. Я в филиальчике работаю). Все закреплено на уровне местных нормативных документов) Последний раз редактировалось allar8, 19.08.2019 в 10:22. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Ну тут по тем же граблям бегали)
|
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Offtop: я только одного не пойму - почему обычный исполнитель из филиальчика ломает голову над шаблонами всероссийской компании? За столько лет компания даже свои шаблоны нормальные не могла сделать?)
|
|||
![]() |
|
||||
Регистрация: 12.03.2013
Сообщений: 611
|
Offtop: Offtop: Шаблоны есть но не допилены на мой взгляд. Голову не ломаю - просто интересно)))
|
|||
![]() |
|
||||
Регистрация: 12.03.2013
Сообщений: 611
|
Цитата:
(vl-cmdf "_.updatefield" "_all" "") - в решетки превращает зараза) подшивочные поля - если с подшивкой связи нет - а не надо бы трогать то подшивочные поля то. ВСЕРЕГЕН жи не трогает, а другие поля обновляет) Т.е. нужно чтоб обновлялось только это поле %<\AcVar USERI1>% Разобралси - вместо (vl-cmdf "_.updatefield" "_all" "") нуно (command "_regenall") Последний раз редактировалось allar8, 20.08.2019 в 13:31. |
|||
![]() |
|
||||
Регистрация: 28.06.2009
Сообщений: 12
|
Иди в категорию полей "Другое" там кликай на "Системные переменные", а тут уже гугл в помощь, был когда то справочник да удалил, думал не нужен - теперь жалею, я использовал от сюда значение "ctab" благодаря которому можно с именем листа производить математические операции. Ну либо макрос (lisp)
|
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Переменная содержащая имя листа | deConstructor | AutoCAD | 6 | 11.11.2007 17:57 |
Есть ли такая системная переменная? | {Smirnoff} | Программирование | 6 | 19.08.2005 12:11 |
Количество листов в layout | AleXYZ | AutoCAD | 6 | 06.05.2004 17:40 |