Тема: Счетчик листов
Здравствуйте!
Подскажите как сделать счетчик листов? Сделал штамп динамическим блоком и сейчас ломаю голову над полями - Лист Листов.
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Autodesk → AutoCAD → Счетчик листов
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Здравствуйте!
Подскажите как сделать счетчик листов? Сделал штамп динамическим блоком и сейчас ломаю голову над полями - Лист Листов.
Спасибо за ссылку, почерпнул от туда пару интересных идей.
Но все же проблема счетчика листов там реализована не в полном объеме, хотелось бы чтобы это работало не в подшивке а просто в чертеже. И поле листов неплохо еслиб само заполнялось..Думаю тут надо придумать нечто с переменной ctab.
Господа подскажите!
Заранее благодарен
> Александр
(2009-01-13 19:37:28
Я в свое время делал счетчик листов без динамический блоков. Просто кнопкой вызывал лисп и он все штампы в лайуатах намеровал простой ставкой тескта.
Да я блок то не ради одного счетчика сделал...А в лиспе прямо скажем не Ас.. Недавно ломал голову над тем как сделать чтобы атрибут ссылался на название листа - в результате долгих и мучительных родов родил - $(getvar,ctab).
Теперь вот озадачен счетчиком...
> Александр
Перешли мне твой файл с блоком, что-нибудь сделаю.
email skorpion1983собачкаmail.ru
здесь придумали
http://forum.dwg.ru/showthread.php?t=27264
Да там все теже Лиспы... Хотелось бы полем осуществить сие...
На мой взгляд данный вопрос решать нужно так: поставить обработчик события на создание/удаление листа. Дабы каждый раз при этом происходило программное обновление поля, содержащего общее количество листов. Обработчики событий в API автокада реализованы нормально, так что сделать это - не проблема.
Т.о. если вы добавите или удалите лист - это сразу же будет отображено в полях всех штампов. имхо удобно и правильно.
> Александр
Подшивка рулит! Как сделать поле с количество листов, см. тут https://www.caduser.ru/forum/topic40745.html
> compositum
Да. идея не плохая, надо попытатся (просто никогда раньше не использовал эту возможность но наслышан)
> kp
Подшивки это конечно хорошо, и я к этому иду, но нумерация листов в подшивке все равно будет осуществляться относительно ВСЕХ листов в подшивке, как быть в таком случае если в подшивку у меня обьеденены несколько альбомов? Нумерация ведь в каждом из них своя...
2 Александр
Суть приведенного ниже кода такова, что при создании нового листа или же при удалении/перемещении текущего листа, или же при копировании существующего листа - происходит автоматическое (динамическое) пересохранение значения количества листов, имеющихся в файле в переменную Useri1.
Переменными пользоваться надеюсь умеете? =) Это всего лишь демострационный вариант. Сохранять не обязательно в переменную, можете хранить в чем угодно.
код тестировал в AutoCAD 2009:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Geometry; namespace Compositum.AutoCAD { public class Class1 { Editor ed; Database db; Document doc; LayoutManager manager; [CommandMethod("regSub")] public void MyFunction() { ed = Application.DocumentManager.MdiActiveDocument.Editor; ed.WriteMessage(string.Format("Code by Compositum...")); doc = Application.DocumentManager.MdiActiveDocument; db = doc.Database; manager = LayoutManager.Current; manager.LayoutCreated += new LayoutEventHandler(manager_LayoutCreated); manager.LayoutRemoved += new LayoutEventHandler(manager_LayoutRemoved); manager.LayoutCopied += new LayoutCopiedEventHandler(manager_LayoutCopied); manager.LayoutsReordered += new EventHandler(manager_LayoutsReordered); db.Useri1 = manager.LayoutCount - 1; } void manager_LayoutsReordered(object sender, EventArgs e) { ShowMessage("Поизведено перемещение листа"); } void manager_LayoutCopied(object sender, LayoutCopiedEventArgs e) { ShowMessage("Произведено копирование листа"); } void manager_LayoutRemoved(object sender, LayoutEventArgs e) { ShowMessage("Произведено удаление листа"); } void manager_LayoutCreated(object sender, LayoutEventArgs e) { ShowMessage("Создан новый лист"); } private void ShowMessage(string text) { db.Useri1 = manager.LayoutCount - 1; ed.WriteMessage(string.Format("\n{0}. Общее количество листов в файле: {1}", text, db.Useri1)); } } }
Это на скорую руку накидал в демонстрационных целях.
Ежели в программировании не рубите, то можете качнуть скомпилированную версию (dll-файл):
http://webfile.ru/2593487
Чтобы запустить ее, наберите в командной строке _.Netload и нажмите пробел или ентер. Откроется диалоговое окошко. В нем выберите тот dll-файл, который скачали (не забыв предварительно распаковать архив ;) ).
После этого, опять же, в командной строке наберите regSub и жмите пробел или ентер.
Всё. можете выполнять разные операции с листами. в командной строке будет автоматом появляться сообщение о том, сколько листов в файле. А через озвученную выше переменную - можете вытаскивать это число.
Повторяю - это всего лишь беглый пример решения проблемы.
Успехов.
=============================================================================
П.С. код работает только для AutoCAD 2009, т.к. я использовал библиотеки именно этой версии автокада и не стал включать их в этот dll-файл.
Уменя 2007... Скачал, проверил - не работает в седьмом...
На DWG.RU предложили такой выход - (setvar "USERI1" (length(layoutlist))), ну и как модификация - ^C^C(setvar "USERI1" (length(layoutlist)));_updatefield;_all;;.
Осталось только написать сценарий - при при удалении, перемещении, копировании листа выполнять вот этот макрос.
2 Александр
Я предупредил, что библиотека написана под 2009-й. Насколько мне известно, вы не сможете написать на Лиспе аналогичный код в виду отсутствия в нем возможностей обрабатывать события (в нашем случае - добавление/копирование/удаление/перенос листа).
В то же время на .NET-языке такое легко сделать (как я и показал выше). Возможно когда-нить перейдёте на 2009-ю версию автокада - тогда убедитесь, что код рабочий. =)))))
Подшивки это конечно хорошо, и я к этому иду, но нумерация листов в подшивке все равно будет осуществляться относительно ВСЕХ листов в подшивке, как быть в таком случае если в подшивку у меня обьеденены несколько альбомов? Нумерация ведь в каждом из них своя...
Сделай для кажого альбома свою подшивку. Вот и всё.
> compositum
Я не ставлю под сомнение работоспособность кода)))
Просто когда мы еще на девятый перем...Неизвестно.
> Makswell
Вариант. Но мне хотелось бы видеть подшивку куда объединены все альбомы, один делает один альбом, другой - другой альбом, третий -третий ну и т.д. и из этих кирпичиков складывается полная катрина.
Опятьже - возможность обзора - Всего проекта сразу (мне кажется это будет очень удобно)
опа...
Оказывается, что в Автокаде нельзя полю назначить данными пользовательскую переменную.
тот же Useri1 к примеру.
В списке системных переменных все переменные, отведенные в пользование юзерам - отсутствуют
Тогда код следует подправить, указав в качестве места хранения инфы о числе листов не переменную пользователя, а свойство, добавленное через _dwgprops.
> compositum
в списке переменных для полей Useri1 нет, но можно напрямую написать в тексте код поля %<\AcVar USERI1>%.
Хотя, если уже пошло программирование, то работа с _dwgprops мне кажется более корректным вариантом.
> compositum
Все работает. Формула для поля - %<\AcVar USERI1>%
Попробуй
Оп..Упустил что ты это уже озвучил...извиняюсь
_dwgprops конечно вариант....но макрос ^C^C(setvar "USERI1" (length(layoutlist)));_updatefield;_all;; мне кажется более приемлемым...
Оп..Упустил что ты это уже озвучил...извиняюсь.
_dwgprops конечно вариант....но макрос ^C^C(setvar "USERI1" (length(layoutlist)));_updatefield;_all;; мне кажется более приемлемым...
> Александр
Вообще-то в подшивке можно иметь листы с одинаковым номером. Я написал про разные подшивки для каждого альбома ввиду того, что в твоей мегаподшивке для всего проекта будет невозможно сформировать ведомость листов, она сформируется именно для всех листов, а не для каждого альбома. А также в подшивке есть такое свойство как "Номер проекта" (у меня в штампе поле в месте, где должен быть шифр) - он для каждого альбома также разный.
точно, спасибо, я уже и забыл про это, привык выбирать из списка =)))))
Вот я и хочу чтобы шифр проекта и прочая информация касающаяся Только этого альбома - заполнялась со свойств чертежа, а то что касаемо подшивки вцелом - со свойств подшивки. Даже на примере Шифра - можно же разделить его, первая часть поля (стандартные буквы и цыфры присвоенные этому проекту) ссылается на свойства подшивки, а вторая часть (марка альбома, позиция ну и т.д.) на свойства чертежа. Ну это к примеру
А ведомость листов еще не делал (спомощью подшивки) поэтому ни чего не могу по этому поводу сказать... Сделаю подшивку ,обкатаю ее и тогда уже выявятся все минусы и плюсы...
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Autodesk → AutoCAD → Счетчик листов
Форум работает на PunBB, при поддержке Informer Technologies, Inc