Тема: Счетчик листов

Здравствуйте!
Подскажите как сделать счетчик листов? Сделал штамп динамическим блоком и сейчас ломаю голову над полями - Лист Листов.

Re: Счетчик листов

http://dwg.ru/dnl/4219

Re: Счетчик листов

Спасибо за ссылку, почерпнул от туда пару  интересных идей.
Но все же проблема счетчика листов там реализована не в полном объеме, хотелось бы чтобы это работало не в подшивке а просто в чертеже. И поле листов неплохо еслиб само заполнялось..Думаю тут надо придумать нечто с переменной ctab.
Господа подскажите!
Заранее благодарен

Re: Счетчик листов

> Александр
(2009-01-13 19:37:28
Я в свое время делал счетчик листов без динамический блоков. Просто кнопкой вызывал лисп и он все штампы в лайуатах намеровал простой ставкой тескта.

Re: Счетчик листов

Да я блок то не ради одного счетчика сделал...А в лиспе прямо скажем не Ас.. Недавно ломал голову над тем как сделать чтобы атрибут ссылался на название листа - в результате долгих и мучительных родов родил - $(getvar,ctab).
Теперь вот озадачен счетчиком...

Re: Счетчик листов

> Александр
Перешли мне твой файл с блоком, что-нибудь сделаю.
email skorpion1983собачкаmail.ru

Re: Счетчик листов

Выслал

Re: Счетчик листов

здесь придумали
http://forum.dwg.ru/showthread.php?t=27264

Re: Счетчик листов

Да там все теже Лиспы... Хотелось бы полем осуществить сие...

Re: Счетчик листов

На мой взгляд данный вопрос решать нужно так: поставить обработчик события на создание/удаление листа. Дабы каждый раз при этом происходило программное обновление поля, содержащего общее количество листов. Обработчики событий в API автокада реализованы нормально, так что сделать это - не проблема.
Т.о. если вы добавите или удалите лист - это сразу же будет отображено в полях всех штампов. имхо удобно и правильно.

Re: Счетчик листов

> Александр
Подшивка рулит! Как сделать поле с количество листов, см. тут https://www.caduser.ru/forum/topic40745.html

Re: Счетчик листов

> compositum
Да. идея не плохая, надо попытатся (просто никогда раньше не использовал эту возможность но наслышан)

> kp
Подшивки это конечно хорошо, и я к этому иду, но нумерация листов в подшивке все равно будет осуществляться относительно ВСЕХ листов в подшивке, как быть в таком случае если в подшивку у меня обьеденены несколько альбомов? Нумерация ведь в каждом из них своя...

Re: Счетчик листов

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-файл.

Re: Счетчик листов

Уменя 2007... Скачал, проверил - не работает в седьмом...
На DWG.RU предложили такой выход - (setvar "USERI1" (length(layoutlist))), ну и как модификация - ^C^C(setvar "USERI1" (length(layoutlist)));_updatefield;_all;;.
Осталось только написать сценарий - при при удалении, перемещении, копировании листа выполнять вот этот макрос.

Re: Счетчик листов

2 Александр
Я предупредил, что библиотека написана под 2009-й. Насколько мне известно, вы не сможете написать на Лиспе аналогичный код в виду отсутствия в нем возможностей обрабатывать события (в нашем случае - добавление/копирование/удаление/перенос листа).
В то же время на .NET-языке такое легко сделать (как я и показал выше). Возможно когда-нить перейдёте на 2009-ю версию автокада - тогда убедитесь, что код рабочий. =)))))

Re: Счетчик листов

Александр пишет:

Подшивки это конечно хорошо, и я к этому иду, но нумерация листов в подшивке все равно будет осуществляться относительно ВСЕХ листов в подшивке, как быть в таком случае если в подшивку у меня обьеденены несколько альбомов? Нумерация ведь в каждом из них своя...

Сделай для кажого альбома свою подшивку. Вот и всё.

Re: Счетчик листов

> compositum
Я не ставлю под сомнение работоспособность кода)))
Просто когда мы еще на девятый перем...Неизвестно.

> Makswell
Вариант. Но мне хотелось бы видеть подшивку куда объединены все альбомы, один делает один альбом, другой - другой альбом, третий -третий ну и т.д. и из этих кирпичиков складывается полная катрина.
Опятьже - возможность обзора - Всего проекта сразу (мне кажется это будет очень удобно)

Re: Счетчик листов

опа...
Оказывается, что в Автокаде нельзя полю назначить данными пользовательскую переменную.
тот же Useri1 к примеру.
В списке системных переменных все переменные, отведенные в пользование юзерам - отсутствуют
Тогда код следует подправить, указав в качестве места хранения инфы о числе листов не переменную пользователя, а свойство, добавленное через _dwgprops.

Re: Счетчик листов

> compositum
в списке переменных для полей Useri1 нет, но можно напрямую написать в тексте код поля %<\AcVar USERI1>%.
Хотя, если уже пошло программирование, то работа с _dwgprops мне кажется более корректным вариантом.

Re: Счетчик листов

> compositum
Все работает. Формула для поля - %<\AcVar USERI1>%
Попробуй

Re: Счетчик листов

Оп..Упустил что ты это уже озвучил...извиняюсь
_dwgprops конечно вариант....но макрос ^C^C(setvar "USERI1" (length(layoutlist)));_updatefield;_all;; мне кажется более приемлемым...

Re: Счетчик листов

Оп..Упустил что ты это уже озвучил...извиняюсь.
_dwgprops конечно вариант....но макрос ^C^C(setvar "USERI1" (length(layoutlist)));_updatefield;_all;; мне кажется более приемлемым...

Re: Счетчик листов

> Александр
Вообще-то в подшивке можно иметь листы с одинаковым номером. Я написал про разные подшивки для каждого альбома ввиду того, что в твоей мегаподшивке для всего проекта будет невозможно сформировать ведомость листов, она сформируется именно для всех листов, а не для каждого альбома. А также в подшивке есть такое свойство как "Номер проекта" (у меня в штампе поле в месте, где должен быть шифр) - он для каждого альбома также разный.

Re: Счетчик листов

точно, спасибо, я уже и забыл про это, привык выбирать из списка =)))))

Re: Счетчик листов

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